2016-12-23 7 views
5

हमारे पास हमारे पूरे प्रोजेक्ट में लिखित अनुरोध पुस्तकालयों का उपयोग है। हाल ही में हम अपने गंतव्यों में से एक में एक बग में आए जहां यह मध्य लेनदेन जम गया, और कनेक्शन को खोलने का फैसला किया।वैश्विक स्तर पर अनुरोधों की टाइमआउट सेटिंग ओवरराइड करने का कोई तरीका है?

स्वाभाविक रूप से, हमारे आवेदन के अनुरूप है।

क्या कोई पर्यावरण परिवर्तनीय है, या टाइमआउट सेट करने का कोई अन्य तरीका है? यहां तक ​​कि यदि यह महत्वपूर्ण है (कहें, 30 सेकंड) यह एक सेवा की वजह से पूरे कार्यों को रोकने से रोकने के लिए पर्याप्त होना चाहिए। यदि संभव हो, तो यह वैश्विक होना चाहिए ताकि मुझे हर एक उपयोग को खोजने की ज़रूरत न हो, और ताकि लोग भविष्य में इसे जोड़ना न भूलें।

उत्तर

5

दुर्भाग्यवश, कोड को देखते हुए, वैश्विक डिफ़ॉल्ट मान सेट करने की कोई संभावना नहीं है। मैं उस से बहुत आश्चर्यचकित था, क्योंकि मैं उम्मीद करता हूं कि यह काफी सामान्य उपयोग के मामले में होगा। यदि आप कोई सुविधा अनुरोध शुरू करते हैं, तो कृपया मुझे बताएं (उदा। इस पोस्ट पर टिप्पणियों में)।

उस के लिए कारण यह है कि get(...), post(...), आदि जैसे तरीकों सभी Session.request(...) पद्धति पर सिर्फ पतली रैपर (requests.get(...) बस एक ही अनुरोध के लिए, नई वन-शॉट सत्र बनाता है) कर रहे हैं। उस विधि को timeout तर्क के रूप में लिया जाता है, और कोई टाइमआउट तर्क नहीं होने पर Session आंतरिक मानों का निरीक्षण नहीं करता है, इसलिए आपको इसे his answer में प्रस्तावित 2ps जैसे मैन्युअल रूप से रखना होगा।

सूत्रों का कहना है:

  • requests/__init__.py - आयात API requests.get(...) तरह उपयोगिताओं
  • प्रदान करने के लिए, गुंजाइश पैकेज
  • requests.api - एपीआई मॉड्यूल है कि ऊपर बिंदु में आयात किया जाता है; usess एक शॉट सत्र
  • requests.sessions - Session कार्यान्वयन
    • line 283 शुरू होता है Session वर्ग
    • line 411 शुरू होता है request(...) विधि
    • line 484 वास्तव में उपयोग करता timeout पैरामीटर
    • line 492 शुरू get(...) विधि
0

आप इसे प्रति कॉल निश्चित रूप से कर सकते हैं timeout पैरामीटर के साथ:

requests.get('http://www.google.com', timeout=10) 

timeout पैरामीटर सेकंड की संख्या या के लिए एक टपल निर्दिष्ट करता है (कनेक्शन समयबाह्य, timout पढ़ें)। आप here के बारे में अधिक पढ़ सकते हैं।

यदि आप यह वैश्विक बनाना चाहते हैं, तो सबसे आसान तरीका सभी कॉल को रैपर वर्ग में दोबारा दोबारा करना है और यह सुनिश्चित करना है कि हर कोई इस एपीआई एंडपॉइंट को कॉल करने के लिए रैपर क्लास का उपयोग कर रहा है। मैंने अनुरोध कोड की त्वरित जांच की और टाइमआउट के लिए वैश्विक ओवरराइड का उपयोग नहीं देखा क्योंकि डिफ़ॉल्ट व्यवहार डेटा की प्रतीक्षा करना है।

+0

नहीं, 'काउंटर = 1; कोशिश करें: request.get ('http://www.google.com', टाइमआउट = 5); सिवाय इसके कि: काउंटर + = 1; यदि काउंटर> My_limit: Nevermind() ' – dsgdfg

0

इसके बजाय आप अनुरोधों का वारिस कर सकते हैं। सत्र वर्ग और request फ़ंक्शन को फिर से लिखें।

HTTP_TIMEOUT = 30 

class TimeoutRequestsSession(requests.Session): 
    def request(self, *args, **kwargs): 
     if kwargs.get('timeout') is None: 
      kwargs['timeout'] = HTTP_TIMEOUT 
     return super(TimeoutRequestsSession, self).request(*args, **kwargs) 

session = TimeoutRequestsSession() 
session.get('https://www.google.com') # connection timeout is default 30s 
+0

इस प्रस्ताव के लिए मुझे हर एक उपयोग को खोजने की आवश्यकता होगी, और किसी भी तरह से सुनिश्चित करें कि लोग भविष्य में इसके बारे में नहीं भूलेंगे। इस तरह यह वास्तव में मेरे प्रश्न का उत्तर नहीं देता है। – Shadow

+0

इसे आसान बनाने के लिए। आप ऐसा कर सकते हैं। 'अनुरोध = TimeoutRequests सत्र(); requests.get (...) ' – codeskyblue

संबंधित मुद्दे