requests的请求机制

库结构:
requests.jpg

工作机制:

  • 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

转载于:https://www.cnblogs.com/liangxiyang/p/11558229.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值