gpt4 book ai didi

python - Python请求库遇到重试限制时如何访问服务器响应

转载 作者:太空狗 更新时间:2023-10-30 02:55:07 24 4
gpt4 key购买 nike

我正在使用 Python 请求库来实现重试逻辑。这是我为重现我遇到的问题而制作的一个简单脚本。在我们用完重试的情况下,我希望能够记录至少一个来自服务器的响应以帮助调试。但是,我不清楚如何访问该信息。当然,我可以通过其他方式实现重试来实现我的目标,但这似乎并不是什么极端情况,我会惊讶地发现请求不支持我的用例。

我查看了它包装的 requests.exceptions.RetryError、requests.packages.urllib3.exceptions.MaxRetryError 以及包装的 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 test.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 test.py

418

-=[ teapot ]=-

_...._
.' _ _ `.
| ."` ^ `". _,
\_;`"---"`|//
| ;/
\_ _/
`"""`

关于python - Python请求库遇到重试限制时如何访问服务器响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43481165/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com