我想强制所有请求在某些 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
但是我需要对不同模块/包中具有许多不同 session 的现有代码执行此操作。其中一些使用 s = Session(); s.get()
,其他人使用requests.get()
。所以,我想强制他们都使用这个Retry
实例。
可以在 requests
上进行吗?包级别(通过初始化、设置、简单的猴子修补 requests
包)?
import requests
# Initialize/setup/patch requests package.
???
# Following should retry on server errors:
requests.Session().get('http://httpstat.us/500')
requests.post('http://httpstat.us/500', data={})
我尝试设置requests.adapters.DEFAULT_RETRIES
至retry
目的。但这不是它的工作原理......
最佳答案
我会使用exponential backoff算法。
这是一个很好的包,为您提供了一个装饰器:backoff 。可与请求
一起使用。
包文档中的代码示例:
@backoff.on_exception(backoff.expo,
requests.exceptions.RequestException,
max_tries=8)
def get_url(url):
return requests.get(url)
关于Python 请求 - 如何为创建的 session 设置默认重试对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38987263/