这不仅会改变最大重试次数,而且还会启用回退策略,使所有http://地址在重试前睡眠一段时间(总共5次):import requests
from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
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 ^{}:如果回退因子为0.1,则sleep()将在重试之间睡眠[0.1s、0.2s、0.4s,…]。如果返回的状态代码是500,502,503或504,则还将强制重试。
其他各种Retry选项允许更细粒度的控制:total–允许的重试总数。
connect–要重试的连接相关错误数。
read–读取错误时重试多少次。
重定向-要执行的重定向数。
method_whitelist–一组大写的HTTP方法动词,我们应该重试。
status_forcelist–一组我们应该强制重试的HTTP状态代码。
退避系数-在两次尝试之间应用的退避系数。
raise_on_redirect–如果重定向数已用尽,是引发一个MaxRetryError,还是返回一个响应代码在3xx范围内的响应。
raise_on_status–类似于raise_on_redirect的含义:如果状态落在status_forcelist范围内,并且重试次数已用尽,则是否应引发异常或返回响应。
NB:raise-on-u status是一个相对较新的版本,尚未发布urllib3或请求。raise-on-u status关键字参数似乎已使其在python 3.6版本中最多进入标准库。
要在特定的HTTP状态代码上重试请求,请使用status-forcelist。例如,状态强制列表=[503]将在状态代码503上重试(服务不可用)。
默认情况下,重试仅在以下情况下触发:无法从池中获取连接。
TimeoutError
HTTPException提升(在Python 3 elsehttplib中从http.client开始)。
这似乎是低级HTTP异常,如URL或protocol not
形状正确。
SocketError
ProtocolError
注意,这些都是阻止接收常规HTTP响应的异常。如果生成任何常规响应,则不执行重试。如果不使用状态强制列表,即使是状态为500的响应也不会重试。
为了使其以更直观的方式操作远程API或web服务器,我将使用上面的代码片段,它强制在状态500,502,503和504上重试,所有这些状态在web上并不少见,并且(可能)在足够长的退避期内可以恢复。
编辑的:直接从urllib3导入{}类。