我正在使用 Python requests 库来实现重试逻辑。这是我为重现我遇到的问题而制作的一个简单脚本。在重试次数用完的情况下,我希望能够记录来自服务器的至少一个响应以帮助调试。但是,我不清楚如何访问该信息。当然,我可以以其他方式实现重试来实现我的目标,但这似乎并不是什么边缘情况,我会惊讶地发现请求不支持我的用例。
我查看了 requests.packages.urllib3.exceptions.MaxRetryError 所包装的 requests.exceptions.RetryError 以及 requests.packages.urllib3.exceptions.ResponseError 所包装的所有内容均无济于事。
我错过了什么吗?
#!/usr/bin/env python
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
from requests.exceptions import RetryError
def main():
retry_policy = Retry(
total=3,
status_forcelist=[418])
session = requests.Session()
session.mount('http://', HTTPAdapter(max_retries=retry_policy))
try:
session.get('http://httpbin.org/status/418')
except RetryError as retry_error:
print retry_error
print retry_error.response is None
if __name__ == '__main__':
main()
$ python 测试.py
HTTPConnectionPool(host='httpbin.org', port=80): Max retries exceeded with url: /status/418 (Caused by ResponseError('too many 418 error responses',))
True
查看 urllib3 源代码,我发现Retry
对象采用一个名为的命名参数raise_on_status
. True
是默认值。当设置为False
,遇到重试限制会导致返回响应而不是引发异常。下面的代码显示我造成了HTTPError
(包含Response
)通过使用抛出raise_for_status
方法上的Response
,但人们也可以轻松地使用Response
直接地。
#!/usr/bin/env python
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
from requests.exceptions import HTTPError
def main():
retry_policy = Retry(
total=3,
status_forcelist=[418],
raise_on_status=False)
session = requests.Session()
session.mount('http://', HTTPAdapter(max_retries=retry_policy))
try:
response = session.get('http://httpbin.org/status/418')
response.raise_for_status()
except HTTPError as e:
print e.response.status_code
print e.response.content
if __name__ == '__main__':
main()
$ python 测试.py
418
-=[ teapot ]=-
_...._
.' _ _ `.
| ."` ^ `". _,
\_;`"---"`|//
| ;/
\_ _/
`"""`
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)