在Python请求get或post方法上干净地设置max_retries

时间:2014-01-27 01:54:29

标签: python python-requests

与旧版请求相关的问题:Can I set max_retries for requests.request?

我没有看到在max_retriesrequests.get()电话中干净地合并requests.post()的示例。

会爱上

requests.get(url, max_retries=num_max_retries))

实施

1 个答案:

答案 0 :(得分:30)

使用Session时,python-requests docsreveal exactly how to set max_retries快速搜索。

直接从文档中提取代码:

import requests
s = requests.Session()
a = requests.adapters.HTTPAdapter(max_retries=3)
b = requests.adapters.HTTPAdapter(max_retries=3)
s.mount('http://', a)
s.mount('https://', b)
s.get(url)

但是,您正在寻找的内容由于以下几个原因而无法配置:

  1. 请求不再提供配置方法

  2. 重试次数特定于所使用的适配器,而不是会话或特定请求。

  3. 如果一个请求需要一个特定的最大请求数,那对于不同的请求就足够了。

  4. 此更改是在一年多前的请求1.0中引入的。我们故意将它保留为2.0,因为它最有意义。我们也不会引入参数来配置最大重试次数或其他任何内容,以防您在考虑询问。


    编辑使用类似的方法,您可以更好地控制重试的工作方式。您可以阅读this以获得良好的感觉。简而言之,您需要从Retry导入urllib3类(见下文),并告诉它如何表现。我们将其传递给urllib3,您将有更好的选项来处理重试。

    from requests.packages.urllib3 import Retry
    import requests
    
    # Create a session
    s = requests.Session()
    
    # Define your retries for http and https urls
    http_retries = Retry(...)
    https_retries = Retry(...)
    
    # Create adapters with the retry logic for each
    http = requests.adapters.HTTPAdapter(max_retries=http_retries)
    https = requests.adapters.HTTPAdapter(max_retries=https_retries)
    
    # Replace the session's original adapters
    s.mount('http://', http)
    s.mount('https://', https)
    
    # Start using the session
    s.get(url)