requests的请求机制

库结构:

工作机制:

  • api.py
    get、post、put、delete等请求方式都在api文件中,另外,api文件中还有个request方法,使用任何一种请求方式都是调用request方法,只是传入的参数不同,比如下面的get方式请求
    def get(url, params=None, **kwargs):
    kwargs.setdefault('allow_redirects', True)
    return request('get', url, params=params, **kwargs)
    request方法定义有三个参数,第一个就是不同的请求方法,第二个是请求的url,第三个是一些以外的参数:

      def request(method, url, **kwargs):
      	with sessions.Session() as session:
          return session.request(method=method, url=url, **kwargs)
    

这个request方法再调用session中Session类的request方法,并把参数穿进去。Session中的request方法如下:

	def request(self, method, url,
        params=None, data=None, headers=None, cookies=None, files=None,
        auth=None, timeout=None, allow_redirects=True, proxies=None,
        hooks=None, stream=None, verify=None, cert=None, json=None):

可以看到,我们平常设置的一些data、params、headers、proxies等参数都是再这里面的

  • session.py
    api中调用了session文件,session.py 实现了整个Session类, 以及一些session功能依赖的外部方法和类(比如其中merge_setting函数实现了将每个请求的参数和session参数的合并,从而可以让一个session中所有请求共用的参数只需要在session中设置,而每个请求可以设置自己特有的参数,同时不影响其他请求,而SessionRedirectMixin类则实现了redirect相关的一些逻辑,这部分逻辑是session必须的,但是又不是session的核心功能,因此通过Mixin类来实现),Session类也暴露了以http方法命名的一系列对外接口,session最核心的功能就是保持会话,因此在prepare_request方法中实现了将session中的headers,cookies,auth等关键参数和每个request的这些参数合并,组合出完整的http请求,最终通过send方法发送出去send方法拿到http请求响应以后,又会将服务端设置的cookies等信息保存在session中,以待下一个request使用。send方法最终发送请求是根据请求schema确定一个实现了BaseAdapter接口的对象来实现的。

      def request(self, method, url,
          params=None, data=None, headers=None, cookies=None, files=None,
          auth=None, timeout=None, allow_redirects=True, proxies=None,
          hooks=None, stream=None, verify=None, cert=None, json=None):
          # Create the Request.
          req = Request(
              method=method.upper(),
              url=url,
              headers=headers,
              files=files,
              data=data or {},
              json=json,
              params=params or {},
              auth=auth,
              cookies=cookies,
              hooks=hooks,
          )
          prep = self.prepare_request(req)
    
          proxies = proxies or {}
    
          settings = self.merge_environment_settings(
              prep.url, proxies, stream, verify, cert
          )
    
          # Send the request.
          send_kwargs = {
              'timeout': timeout,
              'allow_redirects': allow_redirects,
          }
          send_kwargs.update(settings)
          resp = self.send(prep, **send_kwargs)
    
          return resp
    
posted @ 2019-09-20 16:56  梁十安  阅读(539)  评论(0编辑  收藏  举报