【问题标题】:Implementing retry for requests in Python在 Python 中实现请求的重试
【发布时间】:2018-08-13 18:02:49
【问题描述】:

当使用requests 包发送POST 请求时,如何实现5 次重试计数,间隔10 秒。 我找到了很多 GET 请求的示例,而不是 post

这是我目前正在使用的,有时我会收到 503 错误。如果我收到错误的响应 HTTP 代码,我只需要实现重试。

for x in final_payload:
    post_response = requests.post(url=endpoint, data=json.dumps(x), headers=headers)

#Email me the error
if str(post_response.status_code) not in ["201","200"]:
        email(str(post_response.status_code))

【问题讨论】:

标签: python python-3.x python-requests


【解决方案1】:

我发现重试的默认行为不适用于 POST。为此需要添加 method_whitelist,例如下面:

def retry_session(retries=5):
    session = Session()
    retries = Retry(total=retries,
                backoff_factor=0.1,
                status_forcelist=[500, 502, 503, 504],
                method_whitelist=frozenset(['GET', 'POST']))

    session.mount('https://', HTTPAdapter(max_retries=retries))
    session.mount('http://', HTTPAdapter(max_retries=retries))

    return session

【讨论】:

  • 您还应该能够执行method_whitelist=False 以允许在 POST 上重试。
  • 有没有办法为每次重试添加自定义日志记录?
【解决方案2】:

您可以将urllib3.util.retry 模块与requests 结合使用以获得以下内容:

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

def retry_session(retries, session=None, backoff_factor=0.3):
    session = session or requests.Session()
    retry = Retry(
        total=retries,
        read=retries,
        connect=retries,
        backoff_factor=backoff_factor,
        method_whitelist=False,
    )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    return session

用法:

session = retry_session(retries=5)
session.post(url=endpoint, data=json.dumps(x), headers=headers)

注意:您还可以从Retry 类继承并自定义重试行为和重试间隔。

【讨论】:

  • @DhiaTN - 我对此有点困惑。假设我这样做res = session.get(... - 无论如何res 会立即返回吗?或“等待”直到出现错误或正确响应?如果超过最大重试次数会怎样?
  • 无论如何你都会响应,然后你必须检查状态码以了解它是否失败
  • 对我来说,上述操作不起作用。我使用from requests.packages.urllib3.util.retry import Retry 而不是from urllib3.util.retry import Retry
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
  • 2021-09-30
  • 2016-06-12
  • 2017-08-20
相关资源
最近更新 更多