这不仅会更改 max_retries,还会启用退避策略,使所有 http:// 地址的请求在重试之前休眠一段时间(以共5次):
import requests
from requests.adapters import HTTPAdapter, Retry
s = requests.Session()
retries = Retry(total=5,
backoff_factor=0.1,
status_forcelist=[ 500, 502, 503, 504 ])
s.mount('http://', HTTPAdapter(max_retries=retries))
s.get('http://httpstat.us/500')
根据documentation for Retry:如果 backoff_factor 为 0.1,则 sleep() 将在重试之间休眠 [0.05s, 0.1s, 0.2s, 0.4s, ...]。如果返回的状态码是500、502、503或504,它也会强制重试。 p>
Retry 的各种其他选项允许更精细的控制:
-
total – 允许重试的总次数。
-
connect – 要重试多少个与连接相关的错误。
-
read – 读取错误重试多少次。
-
redirect – 执行多少次重定向。
-
method_whitelist – 我们应该重试的大写 HTTP 方法动词集。
-
status_forcelist – 我们应该强制重试的一组 HTTP 状态代码。
-
backoff_factor – 在尝试之间应用的退避因子。
-
raise_on_redirect – 如果重定向次数用尽,是否引发
MaxRetryError,或返回响应代码在 3xx 范围内的响应。
- raise_on_status – 与 raise_on_redirect 类似的含义:如果状态在 status_forcelist 范围内并且重试次数已用尽,我们是否应该引发异常或返回响应。李>
NB:raise_on_status 相对较新,尚未发布 urllib3 或 requests。 raise_on_status 关键字参数似乎最多在 python 3.6 版中进入了标准库。
要在特定 HTTP 状态代码上重试请求,请使用 status_forcelist。例如,status_forcelist=[503] 将重试状态代码 503(服务不可用)。
默认情况下,仅在以下情况下触发重试:
- 无法从池中获得连接。
TimeoutError
-
HTTPException 引发(来自 Python 3 中的 http.client 否则 httplib)。
这似乎是低级 HTTP 异常,例如 URL 或协议不是
格式正确。
SocketError
ProtocolError
请注意,这些都是阻止接收常规 HTTP 响应的异常。如果生成 any 常规响应,则不进行重试。如果不使用 status_forcelist,即使状态为 500 的响应也不会被重试。
为了让它以更直观的方式与远程 API 或 Web 服务器一起工作,我会使用上面的代码 sn-p,它会强制重试状态 500、502、503 和 504,所有这些在网络上并不少见,并且(可能)在足够大的回退期的情况下可以恢复。