我正在使用zeep。我使用的服务不时产生超时错误,我想使用自动重试功能。

我正在尝试使用请求重试会话,但未捕获超时异常,因此未尝试任何重试。

我设置了一个请求重试会话(如下),并且设置了我的类的client属性(当前具有超时值,导致错误):

 session = requests_retry_session()
 transport = Transport(session=session,timeout=20,operation_timeout=.001)
 self.client = Client(self.wsdl_url,transport=transport)


...

def requests_retry_session(
        retries=10,
        backoff_factor=0.3,
        status_forcelist=(500, 502, 503, 504),
        session=None,
) -> requests.Session:
    session = session or requests.Session()
    retry = Retry(
        total=retries,
        read=retries,
        connect=retries,
        backoff_factor=backoff_factor,
        status_forcelist=status_forcelist,
    )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    return session


我收到了一个request.exceptions.ReadTimeout
(我假设此错误与我在现实生活中遇到的错误相同,但是由于超时20秒,我的日志记录还不够好,无法确定)

会话未处理异常。

为什么不?

编辑:zeep在某个地方发送了一个POST请求,我用自己的调试找不到该请求,但是激活Requests中的调试日志会显示该请求。

默认情况下,重试不适用于POST。

https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html

我将method_whitelist = False设置为更改它,现在我触发重试。

最佳答案

设置method_whitelist=False,它将在POST失败时触发重试。小心;您需要知道重复向端点发送POST是否是个坏主意。

这是一些使用请求设置重试会话的代码:

from zeep import Client
from zeep.transports import Transport
import requests
from requests.adapters import HTTPAdapter, Retry

def requests_retry_session(
        retries=5,
        backoff_factor=0.3,
        status_forcelist=(500, 502, 503, 504),
        session=None,**kwargs) -> requests.Session:
    session = session or requests.Session()
    retry = Retry(
        total=retries,
        read=retries,
        connect=retries,
        backoff_factor=backoff_factor,
        status_forcelist=status_forcelist,
        **kwargs
        )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    return session


然后创建将在POST上重试的Zeep客户端实例失败

 session = requests_retry_session(method_whitelist=False)
 transport = Transport(session=session,timeout=30,operation_timeout=30)
 zeep_client = Client(your_wsdl_url,transport=transport)

关于python - 如何使用python zeep重试处理?我正在使用请求重试 session ,但未处理异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58021412/

10-13 09:31