Python请求-如何为创建的会话设置默认重试对象?
我想强制所有请求在某些5xx HTTP状态码上重试。我要做的是: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
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)