2017-11-20 19 views
8

के लिए रोक रहा है मेरे पास एक विशेष यूआरएल है जहां मेरा कोड घंटों (3 घंटे से अधिक) के लिए रुक रहा है। मुझे समझ में नहीं आ रहा है कि ऐसा क्यों करेगा।HTTPAdapter के साथ पायथन अनुरोध घंटे

यूआरएल http://www.etudes.ccip.fr/maintenance_site.php है।

प्रत्यक्ष 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) 
+0

आप अजगर के किन संस्करणों की क्या ज़रूरत है ने कहा है? कोड उबंटू पर पायथन 2.7.12 के साथ ठीक काम करता है। सर्वर यूआरएल के लिए status_code = 503 के साथ प्रतिक्रिया करता है। – andpei

+0

@fast_cen, मुझे पता है कि आप पहले ही एक जवाब स्वीकार कर चुके हैं। लेकिन मुझे विश्वास है कि रीट्री हेडर का सम्मान करने के लिए आप उन रीट्रीज़ को अक्षम करने के बजाय सही तरीके से काम करना चाहते हैं –

उत्तर

5

जवाब में पुन: प्रयास करें-के बाद हैडर सोने के लिए लगता है समस्या जो सोने के लिए कनेक्शन सेट 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() 

समाधान max_retries = 0 सेट करना है। यह आपके आवेदन समाप्त होने तक 2x3600 सेकंड प्रतीक्षा करता है।

4

एडाप्टर है कि आप नीचे

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): 

पर देखने respect_retry_after_header का डिफ़ॉल्ट मान True है। आपको अपने मामले में False की आवश्यकता है। आप कर्ल

$ 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 

का उपयोग कर प्रतिक्रिया का निरीक्षण यदि आप respect_retry_after_header गलत पर सेट करना चाहते हैं। इस अनुकूलक इस व्यवहार

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) 
0

Mylsal के रूप में बनाने और फिर संशोधित करके किया जा सकता है स्थापित करने की कोशिश max_entries

session.mount('http://', HTTPAdapter(max_retries=0)) 
संबंधित मुद्दे