如何使用 python zeep 进行重试处理?我正在使用请求重试会话,但未处理异常
How do I get retry handling with python zeep? I'm using a requests retry session, but the exception is not handled
我正在使用 zeep。我使用的服务时不时会产生超时错误,我想使用自动重试功能。
我正在尝试使用请求重试会话,但没有捕获到超时异常,也没有尝试重试。
我设置了一个请求重试会话(如下)并设置了我的 class 的客户端属性(当前有一个超时值会导致错误):
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
我得到一个 requests.exceptions.ReadTimeout
(我假设这个错误与我在现实生活中遇到的错误相同,但是有 20 秒的超时,我的日志记录还不够好,无法确定)
会话未处理异常。
为什么不呢?
编辑:zeep 在某处发送了一个 POST 请求,我在自己的调试中没有找到,但是在 Requests 中激活调试日志记录显示了它。
默认情况下,重试在 POST 上不起作用。
https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html
我设置 method_whitelist=False 来更改它,现在我正在触发重试。
设置 method_whitelist=False
将在 POST 失败时触发重试。当心;你需要知道重复 POSTs 到你的端点是否是个坏主意。
下面是一些设置请求重试会话的代码:
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
然后创建 Zeep 客户端的实例,该实例将在 POST 上重试失败
session = requests_retry_session(method_whitelist=False)
transport = Transport(session=session,timeout=30,operation_timeout=30)
zeep_client = Client(your_wsdl_url,transport=transport)
我正在使用 zeep。我使用的服务时不时会产生超时错误,我想使用自动重试功能。
我正在尝试使用请求重试会话,但没有捕获到超时异常,也没有尝试重试。
我设置了一个请求重试会话(如下)并设置了我的 class 的客户端属性(当前有一个超时值会导致错误):
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
我得到一个 requests.exceptions.ReadTimeout (我假设这个错误与我在现实生活中遇到的错误相同,但是有 20 秒的超时,我的日志记录还不够好,无法确定)
会话未处理异常。
为什么不呢?
编辑:zeep 在某处发送了一个 POST 请求,我在自己的调试中没有找到,但是在 Requests 中激活调试日志记录显示了它。
默认情况下,重试在 POST 上不起作用。
https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html
我设置 method_whitelist=False 来更改它,现在我正在触发重试。
设置 method_whitelist=False
将在 POST 失败时触发重试。当心;你需要知道重复 POSTs 到你的端点是否是个坏主意。
下面是一些设置请求重试会话的代码:
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
然后创建 Zeep 客户端的实例,该实例将在 POST 上重试失败
session = requests_retry_session(method_whitelist=False)
transport = Transport(session=session,timeout=30,operation_timeout=30)
zeep_client = Client(your_wsdl_url,transport=transport)