2010-07-12 8 views
29

मैं अजगर का उपयोग कर Elgg के लिए एक बाकी ग्राहक लिख रहा हूँ, और यहाँ तक कि जब अनुरोध सफल होता है, मैं जवाब में यह मिलता है: हेडर को देखते हुए, मैं देख रहा हूँअजगर httplib ResponseNotReady

Traceback (most recent call last): 
    File "testclient.py", line 94, in <module> 
    result = sendMessage(token, h1) 
    File "testclient.py", line 46, in sendMessage 
    res = h1.getresponse().read() 
    File "C:\Python25\lib\httplib.py", line 918, in getresponse 
    raise ResponseNotReady() 
httplib.ResponseNotReady 

('सामग्री-लंबाई ',' 574 9 '), इसलिए मुझे पता है कि वहां एक पृष्ठ है, लेकिन मैं इसे देखने के लिए .read() का उपयोग नहीं कर सकता क्योंकि अपवाद आता है। ResponseNotReady का क्या अर्थ है और मैं वापस लौटाई गई सामग्री क्यों नहीं देख सकता हूं?

+0

क्या आप कनेक्शन का पुनः उपयोग कर रहे हैं? – ChristopheD

+0

दरअसल। विचित्र रूप से, कभी-कभी यह काम करता है और कभी-कभी ऐसा नहीं होता है। मैं यह निर्धारित नहीं कर सकता कि क्या व्यवहार निर्धारित करता है कि यद्यपि। – directedition

उत्तर

35

सुनिश्चित करें कि आप पिछले ऑब्जेक्ट से उसी ऑब्जेक्ट का पुन: उपयोग नहीं करते हैं। सर्वर रख-रखाव समाप्त होने और सॉकेट बंद होने के बाद आप इसे दबाएंगे।

+1

आम तौर पर, एक नियम के रूप में, मैं HttpRequest ऑब्जेक्ट्स का पुन: उपयोग करने की कोशिश नहीं करता जब तक कि मेरे पास ऐसा करने के लिए विशिष्ट, प्रदर्शन-संचालित आवश्यकता न हो। बस एकल शॉट 'em – rossipedia

+0

मेरे मामले में,' preload_content = False' जोड़कर समस्या हल हो गई। यहां स्निपेट है: 'http = urllib3.PoolManager (threadsNo, maxsize = threadsNo, block = True); अनुरोध = http.request ('GET', queryUrl, preload_content = झूठा) 'ऐसा लगता है कि 'request.release_conn()' वास्तव में पिछली कनेक्शन ऑब्जेक्ट को रिलीज़ नहीं करता है जब तक उपरोक्त पैरामीटर http.request को पास नहीं किया जाता है। यहां अधिक जानकारी: https://urllib3.readthedocs.org/en/latest/pools.html – dex

2

मैं आज यह एक ही अपवाद में चल रहा था, इस कोड का उपयोग:

conn = httplib.HTTPConnection(self._host, self._port) 
    conn.putrequest('GET', 
     '/retrieve?id={0}'.format(parsed_store_response['id'])) 
    retr_response = conn.getresponse() 

मैं नोटिस नहीं किया था कि मैं putrequest बजाय request उपयोग कर रहा था; मैं अपने इंटरफेस मिश्रण कर रहा था। ResponseNotReady उठाया गया है क्योंकि मैंने वास्तव में अभी तक अनुरोध नहीं भेजा है।

49

पिछला उत्तर सही है, लेकिन एक और मामला है जहां आप यह अपवाद प्राप्त कर सकते हैं: यह है कि यदि आप इंटरमीडिएट प्रतिक्रिया पूरी तरह से पढ़े बिना कई अनुरोध करते हैं।

उदाहरण के लिए:

conn.request('PUT',...) 
conn.request('GET',...) 
# will not work: raises ResponseNotReady 

conn.request('PUT,...) 
r = conn.getresponse() 
r.read() # <-- that's the important call! 
conn.request('GET',...) 
r = conn.getresponse() 
r.read() # <-- same thing 

और इतने पर।

+0

जो मुझे चाहिए था .read() तो मैं अपने कनेक्शन का पुन: उपयोग कर सकता हूं। – schwiz

+0

.read() महंगा है। अगर मुझे प्रतिक्रिया की परवाह नहीं है तो क्या होगा? क्या मैं इसे तेजी से चला सकता हूं?> – SoulMan

+2

@ronnefeldt, https://docs.python.org/3/library/http.client.html पर पायथन डॉक्स में निम्न नोट है: "ध्यान दें कि आपने पहले पूरी प्रतिक्रिया पढ़नी होगी आप सर्वर को एक नया अनुरोध भेज सकते हैं। " – mvsagar

0

इसके अतिरिक्त, इस तरह की त्रुटियां तब हो सकती हैं जब सर्वर सामग्री-लंबाई शीर्षलेख के बिना प्रतिक्रिया भेजता है, जो HTTP क्लाइंट की स्थिति को खराब कर देगा यदि Keep-Alive का उपयोग किया जाता है और एक ही सॉकेट पर एक और अनुरोध भेजा जाता है।

0

यह तब भी हो सकता है जब फ़ायरवॉल कनेक्शन को अवरुद्ध करता है।