2011-03-05 25 views
6

के साथ HTTP प्रमाणीकरण से अजीब व्यवहार मेरे पास एक काम कर रहे पायथन प्रोग्राम है जो एसओएपी के माध्यम से एसयूएपी के माध्यम से बड़ी मात्रा में डेटा ला रहा है। वेब सेवा एक पेजिंग समारोह के साथ लागू किया जाता है ताकि मैं NNN पंक्तियों प्राप्त कर सकते हैं के साथ प्रत्येक लाने फोन और बाद में कॉल के साथ अगले NNN हड़पने। यदि मैं निम्नलिखितसूड एसओएपी लाइब्रेरी

 
client = suds.client.Client(url=url, location=location, username=username, password=password, timeout=timeout) 

जैसे कोड के साथ HTTP सर्वर को प्रमाणीकृत करता हूं तो सबकुछ बढ़िया काम करता है। यदि, हालांकि, मैं निम्नलिखित

 
t = suds.transport.https.HttpAuthenticated(username=username, password=password) 
t.handler = urllib2.HTTPBasicAuthHandler(t.pm) 
t.urlopener = urllib2.build_opener(t.handler) 
client = suds.client.Client(url=url, location=location, timeout=timeout, transport=t) 

यह बिल्कुल 6 पुनरावृत्तियों के लिए काम करता है। यही है अगर मैं प्रति पंक्ति 10 पंक्तियों की एक fetch सीमा निर्दिष्ट करता हूं, तो मुझे 60 पंक्तियां मिलती हैं। सातवें fetch पर, मुझे

 
    File "build/bdist.linux-i686/egg/suds/client.py", line 542, in __call__ 
    File "build/bdist.linux-i686/egg/suds/client.py", line 602, in invoke 
    File "build/bdist.linux-i686/egg/suds/client.py", line 649, in send 
    File "build/bdist.linux-i686/egg/suds/client.py", line 698, in failed 
AttributeError: 'NoneType' object has no attribute 'read' 

क्या किसी के पास कोई सुझाव है कि इसका क्या कारण हो सकता है। यह निश्चित रूप से यह परिवर्तन है जो समस्या पैदा कर रहा है। मैं प्रमाणीकरण शैलियों को आगे और पीछे स्वैप कर सकता हूं और यह पूरी तरह से पुन: उत्पन्न होता है।

मैं सूड 0.4 के साथ पायथन 2.6.6 चला रहा हूं।

धन्यवाद

+0

इस के साथ किसी भी प्रगति: इससे पहले कि आप अपने suds.Client का निर्माण, तो देखने के लिए क्या HTTP त्रुटि 7 लाने उठाता इसे चलाने ये पंक्तियां जोड़ें? अगर मैं कन्स्ट्रक्टर को गलत प्रमाणीकरण डेटा पास करता हूं, तो मुझे अपवाद के बजाय एक ही त्रुटि मिलती है। अगर मैं suds क्लाइंट कन्स्ट्रक्टर को कनेक्ट करने और पास करने के लिए Http प्रमाणीकृत का उपयोग करता हूं, तो प्रमाणीकरण डेटा मान्य होने पर भी मुझे हमेशा 403 खराब अनुरोध (अमान्य प्रमाणीकरण) मिलता है। –

उत्तर

10

समस्या हो कि एक urllib2.HTTPError एक निचले स्तर से उठाया जा रहा है, और इसके fp विशेषता नहीं है लगता है:

लाइन 81 suds.transport.http में:

except u2.HTTPError, e: 
    if e.code in (202,204): 
     result = None 
    else: 
     raise TransportError(e.msg, e.code, e.fp) 

कि अपवाद

: अंत में suds.client में 698 लाइन जहां कि error.fp.read() लाइन चल रही है पारित हो

मैं बंदर-पैच suds.SoapClient वर्ग HTTP त्रुटि कोड और संदेश प्राप्त करने के लिए सुझाव देना चाहेंगे।

class TestClient(suds.client.SoapClient): 
    def failed(self, binding, error): 
     print error.httpcode, error.args 

suds.client.SoapClient = TestClient 
+0

fetch कॉल के 7 वें निष्पादन पर, मुझे "401 ('मूल ऑथ विफल',) कोई नहीं मिला"। यदि मैं क्लाइंट कन्स्ट्रक्टर को उपयोगकर्ता नाम और पासवर्ड पास करता हूं, तो मुझे ऐसी कोई त्रुटि नहीं मिलती है। – zenzic

+0

शायद यह सुनिश्चित करने के लिए कि निम्न 7 वें पास पर आपके परिवहन/हैंडलर का उपयोग किया जा रहा है, निम्न स्तर के urllib2 डीबग करें। सूड किसी कारण से अपने डिफ़ॉल्ट परिवहन का उपयोग करने के लिए वापस स्विच कर रहे हैं, जो विफल रहता है जब कोई उपयोगकर्ता/पास प्रदान नहीं किया जाता है। – samplebias

+1

मैंने आपके पैच का उपयोग किया लेकिन 'प्रिंट..' के बजाय, मैंने 'त्रुटि बढ़ाएं' और सबकुछ अपेक्षित के रूप में काम किया। धन्यवाद! –