Python requests.Session .__ init()__安装HTTPAdapter两次

时间:2017-01-11 19:39:50

标签: python python-requests

以下内容来自请求高级用法

  

请求附带单个传输适配器HTTPAdapter。这个   adapter提供与HTTP和HTTPS的默认请求交互   使用功能强大的urllib3库。无论何时请求会话   初始化,其中一个附加到HTTP的Session对象,   和一个用于HTTPS。

     

挂载调用将传输适配器的特定实例注册到   一个前缀。安装后,使用该会话进行的任何HTTP请求   以给定前缀开头的URL将使用给定的传输适配器。

  1. 如果我想安装自定义传输适配器,换句话说是一个HTTPAdapter,它有自己的retry_codes和retry_max尝试集,那么在安装新的自定义适配器之前卸载所有现有的已挂载HTTPAdapter会不会更好?
  2. 有没有办法动态跟踪像HTTPAdapter这样的传输适配器,例如执行重试的retry_code以及正在执行的重试尝试次数是什么?
  3. 由于

1 个答案:

答案 0 :(得分:2)

session.mount方法用于在属性session.adapters中设置前缀的字典索引。默认会话will mount 2 adapters。您可以基于HTTPAdapter实现一个新类,以实现您所要求的行为。由于重试逻辑是在send()方法中处理的,因此可以调用基类send方法,捕获RetyError异常并单独处理它们。

import requests


class CustomAdapter(requests.adapters.HTTPAdapter):
    # custom __init__?
    def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None):
        try:
             requests.adapters.HTTPAdapter.send(self, request, stream, timeout, verify, cert, proxies)
        except requests.exceptions.RetryError:
             # do your thing


def load_custom(session):
    session.adapters['http://'] = CustomAdapter()

查看Exception handling code in requests以及requests_mock实现的示例