Python请求-如何为创建的会话设置默认重试对象?

Python请求-如何为创建的会话设置默认重试对象?,python,python-requests,Python,Python Requests,我想强制所有请求在某些5xx HTTP状态码上重试。我要做的是: retry = requests.packages.urllib3.util.retry.Retry( total=20, backoff_factor=0.1, status_forcelist=[500, 502, 503, 504], method_whitelist=frozenset(['GET', 'POST'])) for adapter in sess

我想强制所有请求在某些5xx HTTP状态码上重试。我要做的是:

retry = requests.packages.urllib3.util.retry.Retry(
        total=20,
        backoff_factor=0.1,
        status_forcelist=[500, 502, 503, 504],
        method_whitelist=frozenset(['GET', 'POST']))
for adapter in session.adapters.values():
    adapter.max_retries = retry
但是我需要在不同的模块/包中使用大量不同的会话对现有代码执行此操作。其中一些使用
s=Session();s、 get()
,其他人使用
请求。get()
。因此,我想强制所有人都使用这个
重试
实例

是否可以在
请求
包级别执行此操作(通过初始化、设置、简单的猴子补丁
请求
包)

我试图将
请求.适配器设置为
重试
对象。但这不是它的工作原理

import requests
import logging


logging.basicConfig(level='DEBUG')


def forceretry(max_retries):
    """ Decorator for `requests.adapters.HTTPAdapter.__init__`. """
    def decorate(func):
        def wrapper(self, *args, **kwargs):
            func(self, *args, **kwargs)
            self.max_retries = max_retries
        return wrapper
    return decorate


max_retries = requests.packages.urllib3.util.retry.Retry(
        total=20,
        backoff_factor=0.1,
        status_forcelist=[500, 502, 503, 504],
        method_whitelist=frozenset(['GET', 'POST']))

func = requests.adapters.HTTPAdapter.__init__
requests.adapters.HTTPAdapter.__init__ = forceretry(max_retries)(func)

requests.post('http://httpstat.us/500', data={})
它强制每个会话重试
对象(不设置默认会话)。但它对我有效。

我会使用算法

下面是一个很好的包,它为您提供了一个decorator:。可与
请求一起使用

程序包文档中的代码示例:

@backoff.on_exception(backoff.expo,
                      requests.exceptions.RequestException,
                      max_tries=8)
def get_url(url):
    return requests.get(url)
@backoff.on_exception(backoff.expo,
                      requests.exceptions.RequestException,
                      max_tries=8)
def get_url(url):
    return requests.get(url)