2011-03-26 16 views
31

नहीं हो सकता है, मैंने अभी पाइथन 3.1 से पायथन 3.2 (स्वरूपित एचडी) से अपडेट किया है और मेरी स्क्रिप्ट में से एक काम करना बंद कर दिया है। यह मुझे शीर्षक में त्रुटि देता है।टाइपरर: POST डेटा बाइट्स या बाइट्स के पुनरावर्तनीय होना चाहिए। यह str

मैं इसे स्वयं ठीक कर दूंगा लेकिन मुझे यह भी नहीं पता कि बाइट्स का एक पुनरावृत्ति क्या है। मैंने टाइपकास्टिंग बाइट्स (डेटा) की कोशिश की लेकिन यह भी काम नहीं किया। TypeError: एन्कोडिंग के बिना स्ट्रिंग तर्क

url = "http://example.com/index.php?app=core&module=global&section=login&do=process" 
values = {"username" : USERNAME, 
      "password" : PASSWORD} 
data = urllib.parse.urlencode(values) 
req = urllib.request.Request(url, data) 
urllib.request.urlopen(req) 

यह अंतिम पंक्ति पर दुर्घटनाग्रस्त हो जाता है। 3.1 में

काम करता है, लेकिन नहीं 3.2

उत्तर

43

आप मूल रूप से बाइट्स में स्ट्रिंग में कनवर्ट करने की कोशिश में सही था, लेकिन आप इसे गलत तरीके से किया था। पायथन में टाइपकास्टिंग नहीं है (इसलिए आपने जो किया वह टाइपकास्टिंग नहीं था)।

तरह से यह करने के लिए बाइट्स डेटा में पाठ डेटा है, जो आप एनकोड समारोह के साथ क्या सांकेतिक शब्दों में बदलना करने के लिए है:

binary_data = data.encode('encoding') 

क्या इनकोडिंग 'निर्भर करता है होना चाहिए। आपको शायद 'ascii' का उपयोग करना चाहिए। यदि आपके पास ऐसे अक्षर हैं जो ASCII नहीं हैं, तो आपको अन्य एन्कोडिंग का उपयोग करने की आवश्यकता है, आमतौर पर 'utf8', लेकिन फिर आपको प्राप्तकर्ता वेबसेवर को यह भी बताने की आवश्यकता है कि यह यूटीएफ -8 है। यह यूटीएफ 8 भी नहीं चाहता है, लेकिन फिर आपको यह पूछना होगा, और यह जटिल हो रहा है। :-)

+14

यह एक अच्छा जवाब है, लेकिन मैं इसे बेहतर बनाया जा सकता है, तो यह सही लगता है शामिल कोड। यह बिल्कुल स्पष्ट नहीं है कि डेटा कहां से आता है और बाइनरी_डाटा कहां से आपूर्ति करें। –

+1

@rodarmor: 'data' उपरोक्त उदाहरण में परिवर्तनीय 'डेटा' है। 'binary_data' की आपूर्ति की जाती है जहां आपको परिवर्तित डेटा की आवश्यकता होती है। –

+1

मैंने लाइन को जोड़ा जो ओपी के उदाहरण का काम करेगा, क्या आप इसे सुनिश्चित करने के लिए दोबारा जांच सकते हैं कि मुझे यह सही मिला? –

7

@ इंडर्स, मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं इस मुद्दे से लड़ने वाले किसी और के लिए कुछ और चीजों को समझाना चाहता हूं।

यह कोड की इस पंक्ति के साथ यहां विशेष रूप से है:

data = urllib.parse.urlencode(values) 

आप मुद्दों कर रहे है कि, जैसा कि आप डेटा सांकेतिक शब्दों में बदलना करने के लिए कोशिश कर रहे हैं: मान (urlencode)।

आप urlencode क्या करता है खोजने के लिए नीचे करने के लिए urllib.parse प्रलेखन पुस्तक को संदर्भित करते हैं: https://docs.python.org/3/library/urllib.parse.html < ~ आपको लगता है कि आप अपने उपयोगकर्ता एन्कोड करने के लिए/एक डेटा स्ट्रिंग में पारित कोशिश कर रहे हैं देखेंगे:

Convert a mapping object or a sequence of two-element tuples, which may contain str or bytes objects, to a percent-encoded ASCII text string. If the resultant string is to be used as a data for POST operation with the urlopen() function, then it should be encoded to bytes, otherwise it would result in a TypeError.

शायद आप जो करने का प्रयास कर रहे हैं वह आपके उपयोगकर्ता/पासवर्ड की कुछ प्रकार की एन्क्रिप्शन है, लेकिन मुझे नहीं लगता कि यह सही तरीका है। यदि ऐसा है, तो आपको शायद यह सुनिश्चित करने की आवश्यकता है कि प्राप्त करने वाला अंत (आपके यूआरएल का गंतव्य) जानता है कि आप इसके साथ अपने उपयोगकर्ता/पास को एन्कोड कर रहे हैं।

शक्तिशाली अनुरोध लाइब्रेरी का उपयोग करने के लिए एक और अद्यतित दृष्टिकोण है। http://docs.python-requests.org/en/master/user/authentication/

इस मामले में, मैं इस तरह कुछ करना चाहते हैं:: वे बहुत ही आम प्रमाणीकरण प्रोटोकॉल के साथ संगतता है

requests.get(url, auth=('user', 'pass')) 
संबंधित मुद्दे