urllib3:抛出MaxRetryError时如何获得响应?

问题描述 投票:1回答:1

我正在使用Pythonurllib3+ requests中的Retry模块,以防第三方API偶尔出现错误。我遇到的一个问题是,如果重试一直失败,我会得到exceptions.MaxRetryError,却永远看不到响应是什么。如果服务器中有有价值的调试数据该怎么办?

在抛出MaxRetryError的情况下,是否仍有办法得到响应?

下面是我的代码

from requests.packages.urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter

def req_with_retry(retries=3, backoff_factor=0.5, status_forcelist=(400, 404, 500, 502, 504,), method_whitelist=frozenset(['POST', 'HEAD', 'TRACE', 'GET', 'PUT', 'OPTIONS', 'DELETE']), session=None,):
    ''' 
    this returns a session that functions like the requests module but with retries built it for certain status codes
    '''
    session = session or requests.Session()
    retry = Retry(
        total=retries,
        read=retries,
        connect=retries,
        backoff_factor=backoff_factor,
        status_forcelist=status_forcelist,
        method_whitelist=method_whitelist
    )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    return session

r = req_with_retry().get(url="https://www.google.com")
python python-requests urllib3
1个回答
0
投票

[首先,我想提一下,因为urllib3已从请求中撤消,所以不再需要from requests.packages.urllib3.util.retry import Retry。考虑使用from urllib3.util.retry import Retry表单,因为它不涉及黑客行为(请参阅https://github.com/psf/requests/blob/v2.22.0/requests/packages.py)。

第二,不,不可能,对不起! urllib3甚至竭尽全力删除drain_and_release_conn留下的所有数据。

但是我不明白为什么这个问题专门针对重试,如果不重试,您将得到相同的行为:urllib3不会向您显示响应数据,只是一个例外。

通常情况下例外就足够了,如果不是这样,您可以添加一些调试/跟踪日志,但这似乎比仅使用Wireshark查看通过网络发送的数据要困难得多。

© www.soinside.com 2019 - 2024. All rights reserved.