2010-03-22 15 views
28

BaseHTTPHandler http अनुरोध पैरामीटर का उपयोग करने के लिए किसी भी सुविधाजनक तरीका प्रदान करने के लिए प्रतीत नहीं होता। मार्ग से जीईटी पैरामीटर और अनुरोध निकाय के POST पैरामीटर को पार्स करने का सबसे अच्छा तरीका क्या है?बेस एचटीटीपी हैंडलर से पार्स http GET और POST पैरामीटर? BaseHTTPServer मॉड्यूल से

अभी, मैं के लिए इस का उपयोग कर रहा:

def do_GET(self): 
    parsed_path = urlparse.urlparse(self.path) 
    try: 
     params = dict([p.split('=') for p in parsed_path[4].split('&')]) 
    except: 
     params = {} 

यह ज्यादातर मामलों के लिए काम करता है, लेकिन मुझे लगता है कि ठीक से खाली मानकों की तरह एन्कोडिंग और मामलों को संभालती है और अधिक मजबूत कुछ करना चाहते हैं। आदर्श रूप में, मुझे एक पूर्ण वेब ढांचे के बजाय कुछ छोटा और स्टैंडअलोन चाहिए।

उत्तर

5

आप Werkzeug मॉड्यूल का प्रयास कर सकते हैं, आधार Werkzeug लाइब्रेरी बहुत बड़ी नहीं है और यदि आवश्यक हो तो आप बस इस कोड को निकाल सकते हैं और आप कर चुके हैं।

url_decode विधि एक MultiDict वापस आती है और एन्कोडिंग समर्थन :)

रूप urlparse.parse_qs विधि करने के लिए विरोध WERKZEUG संस्करण का ख्याल रखता है है:

  • एन्कोडिंग
  • से अधिक मान
  • सॉर्ट क्रम

आप कोई n है, तो अंतर्निहित समाधानों का उपयोग करने के लिए स्वतंत्र महसूस करने के लिए इन (या एन्कोडिंग के मामले में, पायथन 3 का उपयोग करें) के लिए ईड।

2

आप CherryPy तरह पुस्तकालयों का उपयोग कर जांच की है? वे बेसएचटीटीपीएस सर्वर से इन चीजों को संभालने के लिए एक बहुत तेज रास्ता प्रदान करते हैं।

2

बेसिक HTTP अनुरोध पैरामीटर समर्थन CGI module में प्रदान की जाती है। फॉर्म डेटा को संभालने के लिए अनुशंसित तंत्र cgi.FieldStorage वर्ग है।

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

FieldStorage उदाहरण एक अजगर शब्दकोश की तरह सूचीबद्ध किए जा सकते। यह ऑपरेटर के साथ सदस्यता परीक्षण की अनुमति देता है, और यह भी मानक शब्दकोश विधि keys() और निर्मित समारोह len() का समर्थन करता है। खाली तार वाले फॉर्म फ़ील्ड को अनदेखा किया जाता है और शब्दकोश में प्रकट नहीं होता है; ऐसे मान रखने के लिए, FieldStorage उदाहरण बनाते समय वैकल्पिक keep_blank_values ​​कीवर्ड पैरामीटर के लिए एक वास्तविक मान प्रदान करें।

उदाहरण के लिए निम्नलिखित कोड (जो मानता है कि Content-Type हैडर और रिक्त पंक्ति पहले से ही मुद्रित किया गया है) की जाँच करता है कि खेतों नाम और पते की दोनों एक गैर रिक्त स्ट्रिंग पर सेट कर रहे हैं:

form = cgi.FieldStorage() 
if "name" not in form or "addr" not in form: 
    print "<H1>Error</H1>" 
    print "Please fill in the name and addr fields." 
    return 
print "<p>name:", form["name"].value 
print "<p>addr:", form["addr"].value 
#...further form processing here... 
+0

सीजीआई पुस्तकालय एन्कोडिंग संभाल नहीं करता है के साथ utf की तरह होगा -8) आपके लिए उपलब्ध है, इसलिए यह उपलब्ध कुछ अन्य पुस्तकालयों की तुलना में कम अनुकूल है। – Wolph

+0

फ़ाइल को एन्कोडिंग को फ़ील्डस्टॉरेज के पहले तर्क के रूप में प्रस्तुत किया जा सकता है। – gimel

+0

सच है, लेकिन जब स्क्रिप्ट्स हैं जो त्रुटियों को पकड़ने सहित आपके लिए इसे संभालने में परेशान हैं? पहिया को फिर से शुरू करने की कोई ज़रूरत नहीं है। – Wolph

78

आप url.parse उपयोग कर सकते हैं:

>>> from url.parse import urlparse, parse_qs 
>>> url = 'http://example.com/?foo=bar&one=1' 
>>> parse_qs(urlparse(url).query) 
{'foo': ['bar'], 'one': ['1']} 

के लिए अजगर 2, मॉड्यूल urlparse बजायनाम है। एक पुराने सवाल का

+2

यह ध्यान दिया जाना चाहिए कि पायथन 2 में urlparse एन्कोडिंग को संभाल नहीं करता है, पायथन 3 संस्करण इसका समर्थन करता है। इसके अतिरिक्त, सही क्रम को बनाए रखने के लिए 'parse_qsl' का उपयोग' parse_qs' के बजाय किया जाना चाहिए जो एक सूची देता है। – Wolph

8

बेहतर समाधान:

def do_POST(self): 
    length = int(self.headers.getheader('content-length')) 
    field_data = self.rfile.read(length) 
    fields = urlparse.parse_qs(field_data) 

इस दस्तावेज़ की सामग्री से urlencoded पोस्ट डेटा खींच और यह एक dict (पार्स उचित urldecoding

+0

मैं सबसे बुनियादी सर्वर बनाने की कोशिश कर रहा था जो पाइथन में अनुरोध प्राप्त करने और पोस्ट करने के लिए संभाल सकता था, और केवल आपके अनुरोधों को पोस्ट अनुरोधों में संभालने में कामयाब रहा। यह 3 साल पहले लिखा गया था, लेकिन धन्यवाद! :) – harkirat1892