Python 如何从请求中覆盖urllib3中的\u头之后的尊重\u重试\u?

Python 如何从请求中覆盖urllib3中的\u头之后的尊重\u重试\u?,python,python-requests,urllib,urllib3,Python,Python Requests,Urllib,Urllib3,请求此URL时,此标题将被接收回: {'headers':HTTPHeaderDict({'Date':'Wed,2019年11月20日18:40:39 GMT','Server':'Apache/2.4.41(Unix)“,”X-Powered-By“:”PHP/7.1.33“,”Expires“:”Wed,Jan 1984 05:00:00 GMT“,”缓存控制“:”无缓存,必须重新验证,最大年龄=0“,”重试后“:”86400“,”Vary“:”用户代理“,”连接“:”关闭“,”传输编码“

请求此URL时,此
标题将被接收回:

{'headers':HTTPHeaderDict({'Date':'Wed,2019年11月20日18:40:39 GMT','Server':'Apache/2.4.41(Unix)“,”X-Powered-By“:”PHP/7.1.33“,”Expires“:”Wed,Jan 1984 05:00:00 GMT“,”缓存控制“:”无缓存,必须重新验证,最大年龄=0“,”重试后“:”86400“,”Vary“:”用户代理“,”连接“:”关闭“,”传输编码“:”分块“,”内容类型“:”text/html;charset=UTF-8“),“状态”:503,“版本”:11,“原因”:服务暂时不可用,“严格”:0,“解码内容”:False,“重试”:重试(总计=2,连接=None,读取=None,重定向=None,状态=None)“强制内容长度”:False,“自动关闭”:True,“解码器”:None,“正文”:None,“原始响应”:None,“字节读取”:7482,“消息”:None,“请求url”:None,“池”:None,“连接”:None,“分块”:True,“分块左”:None,“剩余长度”:None”
这意味着两个参数:

  • 状态\u代码:503
    ,这意味着
    重试
    过程
  • 在:86400之后重试
retry\u将
设置为
86400
后,我的
请求。Session()
将暂停一整天

以下是提交的代码:

def sleep\u用于重试(self,response=None):
retry\u after=self.get\u retry\u after(响应)
如果在以下时间后重试\u:
时间。睡眠(之后重试)#在此停止
返回真值
返回错误
urllib3.util.retry.py:277

retry
对象的
\uuuu init\uuuu
中,可以将
尊重\u retry\u after\u header
更改为不尊重
重试\u after
参数

def\uu init__(
自己
总计=10,
连接=无,
read=无,
重定向=无,
状态=无,
方法\白名单=默认方法\白名单,
状态\强制列表=无,
退避系数=0,
在_重定向时引发_=真,
在_状态时升高_=真,
历史=无,
尊重\u头后重试\u=True,
删除\u头\u on\u redirect=默认\u redirect\u头\u黑名单,
)
urllib3.util.retry.py:174


您知道如何从我的
requests.Session()
中覆盖
respect\u retry\u after
参数吗?

因为
sleep\u for\u retry
调用
get\u retry\u after
,调用
parse\u retry\u after
来解析
retry after
头值,您可以使用包装函数覆盖
parse\u retry\u after
,该包装函数使用
min
函数将其返回值设置为上限(以下示例将其上限设置为10秒):

而控制重试的有文档记录的方法是将urllib3
Retry
对象传递给requests
HTTPAdapter
并将该适配器装载到
会话
对象上。它的工作原理如下:

导入urllib3
导入请求
导入请求。适配器
retry=urllib3.retry(在头=False之后重试)
adapter=requests.adapters.HTTPAdapter(最大重试次数=重试次数)
会话=请求。会话()
装载(“http://”,适配器)
r=会话。获取(“http://www.trouverlesmots.com")
打印(r.状态\ U代码,r.标题)

事实证明,无需修补即可完成此操作。请参阅我的答案。
from urllib3.util.retry import Retry
orig_parse_retry_after = Retry.parse_retry_after
Retry.parse_retry_after = lambda self, retry_after: min(10, orig_parse_retry_after(self, retry_after))