带有HTTPAdapter的Python请求已停止数小时

带有HTTPAdapter的Python请求已停止数小时,python,python-requests,urllib3,Python,Python Requests,Urllib3,我有一个特殊的URL,其中我的代码会暂停数小时(超过3小时)。我似乎不明白为什么会这样 网址是 Direct requests.get()可以即时工作,但每当我有一个HTTPAdapter时,代码似乎会无限期地休眠 import requests from requests.adapters import HTTPAdapter url = 'http://www.etudes.ccip.fr/maintenance_site.php' session = requests.Sessi

我有一个特殊的URL,其中我的代码会暂停数小时(超过3小时)。我似乎不明白为什么会这样

网址是

Direct requests.get()可以即时工作,但每当我有一个HTTPAdapter时,代码似乎会无限期地休眠

import requests
from requests.adapters import HTTPAdapter    

url = 'http://www.etudes.ccip.fr/maintenance_site.php'
session = requests.Session()
session.mount('http://', HTTPAdapter(max_retries=2))
session.get(url, timeout=2)

响应中的retry after标头是将连接设置为睡眠3600秒的问题。请参阅urllib3中的retry.py

    def sleep(self, response=None):
    """ Sleep between retry attempts.

    This method will respect a server's ``Retry-After`` response header
    and sleep the duration of the time requested. If that is not present, it
    will use an exponential backoff. By default, the backoff factor is 0 and
    this method will return immediately.
    """

    if response:
        slept = self.sleep_for_retry(response)
        if slept:
            return

    self._sleep_backoff()

解决方案是将最大重试次数设置为0。这避免了在应用程序结束前等待2x3600秒。

您初始化的适配器使用以下命令设置重试

    if max_retries == DEFAULT_RETRIES:
        self.max_retries = Retry(0, read=False)
    else:
        self.max_retries = Retry.from_int(max_retries)
如果你看一下初始化

def __init__(self, total=10, connect=None, read=None, redirect=None, status=None,
             method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None,
             backoff_factor=0, raise_on_redirect=True, raise_on_status=True,
             history=None, respect_retry_after_header=True):
头后的
尊重\u重试\u的默认值为
True
。在您的案例中,您需要此
False
。如果使用curl检查响应

$ curl -I http://www.etudes.ccip.fr/maintenance_site.php
HTTP/1.1 503 Service Temporarily Unavailable
Date: Thu, 23 Nov 2017 14:15:49 GMT
Server: Apache
Status: 503 Service Temporarily Unavailable
Retry-After: 3600
Expires: Sat, 26 Jul 1997 05:00:00 GMT
Cache-Control: pre-check=0, post-check=0, max-age=0
Pragma: no-cache
Connection: close
Content-Type: text/html; charset=ISO-8859-1
您希望将
尊重\u重试\u之后的\u标题设置为False。这可以通过创建适配器然后修改此行为来实现

import requests
from requests.adapters import HTTPAdapter

url = 'http://www.etudes.ccip.fr/maintenance_site.php'
session = requests.Session()

adapter = HTTPAdapter(max_retries=2)
adapter.max_retries.respect_retry_after_header = False

session.mount('http://', adapter)

session.get(url, timeout=2)

正如Mylsal所说,尝试设置max_条目

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

你有什么版本的Python?代码在Ubuntu上与Python2.7.12配合使用效果良好。服务器对url的响应状态为“代码=503”。@fast\u cen,我知道你已经接受了答案。但我相信正确的方法是,不要禁用重试,而是禁用重试头