2013-07-17 9 views
6

मैं पाइथन (v3.3 का उपयोग करके) और वेब प्रोग्रामिंग के लिए नौसिखिया हूं और मैं पूरी रात एक समस्या से जूझ रहा हूं। मैं अपने सर्वर के लिए एक पोस्ट कॉल जारी करने कर रहा हूँ और यह कुछ डेटा भेजने इस प्रकार है:मैं BaseHTTPRequestHandler का उपयोग कर अपने सर्वर पर भेजे गए डेटा तक कैसे पहुंच सकता हूं?

DATA = {"listName":"Test list","listDesc":"A test list with test stuff in it.","refreshMode":"Replace","DBKey":"1","UserDisplaySeq":"1"} 
DATA = json.dumps(DATA) 
METHOD = "POST" 
DATA = DATA.encode("utf-8") 
params = "account_id=acct 2" 
try: 
    URL = "http://localhost:8080/lists?" + quote_plus(params) 
    request = urllib.request.Request(url=URL,data=DATA,method=METHOD) 
    response = urllib.request.urlopen(request) 
... 

इस प्रकार मैं भी एक अनुरोध हैंडलर कोडित है (वहाँ डीबगिंग उद्देश्यों के लिए यहाँ में प्रिंट बयान की बहुत हैं):

class MyHandler(BaseHTTPRequestHandler): 
... 
def do_POST(self): 
    length = int(self.headers['Content-Length']) 
    print("HEADERS: ", self.headers) 
    print (str(length)) 
    print(self.rfile) 
    post_data = urllib.parse.parse_qs(self.rfile.read(length).decode('utf-8')) 
    print(post_data) 

यह कंसोल के लिए निम्न परिणाम प्रिंट:

Starting thread 
started httpserver... 
HEADERS: Accept-Encoding: identity 
User-Agent: Python-urllib/3.3 
Content-Length: 138 
Content-Type: application/x-www-form-urlencoded 
Host: localhost:8080 
Connection: close 


138 
<_io.BufferedReader name=404> 
{} 

मेरे सवालों का:
1) सर्वर (do_POST) में, मैं कैसे करना है डेटा का उपयोग करें जो मुझे लगता है कि मैं अपने अनुरोध के साथ भेज रहा हूं (यानी। { "Listname": "टेस्ट सूची", "listDesc": "एक परीक्षण ...)

2) मेरे अनुरोध भी पहली जगह में डेटा भेजने है

3) वहाँ एक जगह है? जहां इस नौसिखिया-सुलभ संदर्भ में प्रलेखित है?

+0

आप पाते हैं कि फ्लास्क या बोतल जैसे वेब ढांचे का उपयोग करके यह सामान बहुत आसान हो जाएगा। – Blender

+0

@ ब्लेंडर - सलाह के लिए धन्यवाद। मैंने बोतल का उपयोग करने की कोशिश की लेकिन यह वास्तव में एचटीएमएल का उपयोग करने के लिए तैयार था, जो हमारे मामले में, हम इसका उपयोग नहीं कर रहे हैं। हम एकाधिक सर्वरों में काम को संतुलित करने के लिए एक शानदार एप्लिकेशन लिख रहे हैं और इसमें वास्तव में ब्राउज़र घटक नहीं है। इन सभी चीजों की तरह, मुझे बोतल के दस्तावेज भी बहुत अच्छे लगते हैं यदि आप पहले से ही अपनी सामग्री जानते थे लेकिन शुरुआती लोगों के लिए वास्तव में कठिन है जिनके पास वेब अवधारणाओं में पृष्ठभूमि नहीं है। – Ben

उत्तर

5

इस आज़मा कर देखें। मैं इसे an answer to another question

def do_POST(self): 
    ctype, pdict = cgi.parse_header(self.headers.getheader('content-type')) 
    if ctype == 'multipart/form-data': 
     postvars = cgi.parse_multipart(self.rfile, pdict) 
    elif ctype == 'application/x-www-form-urlencoded': 
     length = int(self.headers.getheader('content-length')) 
     postvars = cgi.parse_qs(self.rfile.read(length), keep_blank_values=1) 
    else: 
     postvars = {} 

    print(postvars.get("listName", "didn't find it")) 
+0

धन्यवाद, नेट, यह वास्तव में सहायक था। मैंने cgi.parse_qs को urllib.parse.parse_qs के साथ बदल दिया और ऐसा लगता है कि यह काम करता है। मैं अभी यह समझने के लिए बहुत थक गया हूं कि अभी क्यों चल रहा है लेकिन यह चाल keep_blank_values ​​= 1 ध्वज थी। – Ben

4

1) से चुरा लिया सर्वर (do_POST) में, मैं डेटा कैसे उपयोग करते हैं मुझे लगता है कि मैं ' मैं अपने अनुरोध के साथ भेज रहा हूं (यानी {"listName": "टेस्ट सूची", "listDesc": "एक परीक्षण ...)?

प्रिंट self.rfile.read (लम्बाई):

तुम सिर्फ द्वारा डेटा का उपयोग कर सकते हैं। यह सुनिश्चित करने के बाद

यह सुनिश्चित करने के बाद। आप अन्य पार्स काम कर सकते हैं। मैं सुझाव देता हूं कि जेसन स्ट्रिंग को डीकोड करने के लिए सरलजसन का उपयोग करें। urllib.parse.parse_qs अनावश्यक लगता है।

2) क्या मेरा अनुरोध डेटा को पहले स्थान पर भी भेज रहा है?

the code looks fine. to make sure it works, just try: 

    curl -d "asdf" http://yourhost:yourport 

to see if the server have same response. 
so you can know whether the server side or client side goes wrong. 

3) क्या ऐसी कोई जगह है जहां इसे नौसिखिया-सुलभ शर्तों में दस्तावेज किया गया है?

the official document is always a good choice: 
http://docs.python.org/2/library/basehttpserver.html 
+0

किसी कारण से, प्रिंट self.rfile.read (लंबाई) मेरे लिए काम नहीं करता है - यह केवल पाइथन खोल (Win7 में IDLE) को लटकने का कारण बनता है। साथ ही, जिस दस्तावेज़ को आप इंगित करते हैं वह बिंदु में एक महान मामला है। मैंने इससे उठाया कि मुझे 'rfile' विशेषता तक पहुंचने की आवश्यकता है लेकिन यह keep_blank_values ​​पैरामीटर के बारे में कुछ भी नहीं कहता है। मुझे संदेह है कि वेब पर कुछ साहित्य हैं जो मदद कर सकते हैं लेकिन, क्योंकि वहां बहुत कुछ है, सही वस्तु ढूंढना कठिन है। फिर भी, आपकी सहायता के लिए धन्यवाद! – Ben

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

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