2009-02-09 13 views
30

से पोस्ट डेटा तक पहुंचने से मुझे लगता है कि डब्लूएसजीआई का उपयोग करके पोस्ट डेटा तक पहुंच कैसे प्राप्त करें। मैंने wsgi.org वेबसाइट पर उदाहरण की कोशिश की और यह काम नहीं किया। मैं अभी पाइथन 3.0 का उपयोग कर रहा हूं। कृपया डब्लूएसजीआई ढांचे की सिफारिश न करें क्योंकि यह वह नहीं है जिसे मैं ढूंढ रहा हूं।डब्लूएसजीआई

मैं यह जानना चाहता हूं कि इसे फ़ील्डस्टोर ऑब्जेक्ट में कैसे प्राप्त किया जाए।

+0

एफडब्ल्यूआईडब्लू, इस समय पर पाइथन 3.0 के लिए अभी भी कोई डब्लूएसजीआई विनिर्देश नहीं है, इसलिए आप जो कुछ भी करते हैं, वह संभवतः बर्बाद प्रयास होगा क्योंकि किसी भी अंतिम विनिर्देश अद्यतन को पाइथन 3.0 के लिए जो भी कह सकता है उसे लागू करने के किसी भी प्रयास के साथ संगत नहीं हो सकता है । डब्लूएसजीआई अनुप्रयोगों के लिए आप पाइथन 2.X के साथ रहने से बेहतर हैं। –

+6

@ ग्राहम डंपलटन अब और नहीं: http://www.python.org/dev/peps/pep-3333/ (चलिए उन लोगों को गुमराह नहीं करते जो इसे मेरे जैसे थोड़ी देर बाद पढ़ते हैं - अपना समय भी बचाते हैं) – JeromeJ

+2

@JermoeJ - उन्होंने लिखा 200 9 में टिप्पणी, और आप 2013 में इसका जवाब दे रहे हैं; ऐसा नहीं लगता कि वह किसी को भी गुमराह करने की कोशिश कर रहा था। :) – Sam

उत्तर

28

मान लें कि आप एक FieldStorage वस्तु में सिर्फ पोस्ट डेटा प्राप्त करने की कोशिश कर रहे हैं:

# env is the environment handed to you by the WSGI server. 
# I am removing the query string from the env before passing it to the 
# FieldStorage so we only have POST data in there. 
post_env = env.copy() 
post_env['QUERY_STRING'] = '' 
post = cgi.FieldStorage(
    fp=env['wsgi.input'], 
    environ=post_env, 
    keep_blank_values=True 
) 
+0

यह पायथन 3.0 में काम नहीं करता है - इसमें wsgi.input स्ट्रिंग के बजाए बाइट्स लौटने में समस्या है। :(मुझे Python 3.0 में ऐसा करने का एक तरीका चाहिए ... –

+0

क्या डब्लूएसजीआई हैंडलर आप उपयोग कर रहे हैं? अगर मैं अंतर्निहित CGIHandler का उपयोग करता हूं तो यह मेरे लिए ठीक काम करता है। मेरे पास एक फ़ाइल "post.cgi" है http://pastebin.com/f40849562 पर सामग्री के साथ मेरा स्थानीय सर्वर बस ठीक चल रहा है। –

+0

क्या io क्लास wsgi.input है? यदि यह एक बुफर्डियोबेस है तो आपको इसे TextIOWrapper में लपेटने में सक्षम होना चाहिए ताकि सीजीआई FieldStorage इसका उपयोग कर सकते हैं। –

-1

मैं आपको सुझाव दूंगा कि आप उदाहरण के लिए कुछ ढांचे कैसे करते हैं। (मैं किसी भी एक एक की सिफारिश कर रहा हूँ नहीं, सिर्फ एक उदाहरण के रूप में उन्हें इस्तेमाल करते हैं।)

यहाँ Werkzeug से कोड है:

http://dev.pocoo.org/projects/werkzeug/browser/werkzeug/wrappers.py#L150

जो कहता है

http://dev.pocoo.org/projects/werkzeug/browser/werkzeug/utils.py#L1420

यह एक है संक्षेप में संक्षेप में जटिल है, इसलिए मैं नहीं करूँगा।

+0

अभी भी पायथन 3.0 में काम नहीं करता है, और यही वह है जिसे मैं ढूंढ रहा हूं। वैसे भी धन्यवाद, हालांकि। –

+1

-1 प्रश्न ने ढांचे को दिखाने के लिए नहीं कहा –

+2

@FireCrow यह देखते हुए कि फ्रेमवर्क एक अच्छा विचार क्यों प्रतीत होता है। यह वास्तव में एक ढांचे के तरीके की सलाह नहीं दे रहा है। – JeromeJ

22
body= '' # b'' for consistency on Python 3.0 
try: 
    length= int(environ.get('CONTENT_LENGTH', '0')) 
except ValueError: 
    length= 0 
if length!=0: 
    body= environ['wsgi.input'].read(length) 

ध्यान दें कि WSGI अभी तक अजगर 3.0 के लिए पूरी तरह से निर्दिष्ट नहीं है, और लोकप्रिय WSGI बुनियादी ढांचे के ज्यादा परिवर्तित नहीं किया गया है (या 2to3d गया है, लेकिन ठीक से परीक्षण नहीं)। (यहां तक ​​कि wsgiref.simple_server भी नहीं चलेगा।) आप आज रात 3.0 पर डब्लूएसजीआई कर रहे हैं।

+0

हाँ मुझे काम करने के लिए wsgiref प्राप्त करने में समस्याएं थीं। मैं पैच को लागू करने के समाप्त हो गया। –

+0

http://www.python.org/dev/peps/pep-3333/ पायथन 3 के लिए डब्ल्यूएसजीआई पीईपी 3. – JeromeJ

3

यह मेरे लिए काम किया (अजगर 3.0 में):

import urllib.parse 

post_input = urllib.parse.parse_qs(environ['wsgi.input'].readline().decode(),True) 
1

यहां तक ​​कि छोटे

l = int(env.get('CONTENT_LENGTH')) if env.get('CONTENT_LENGTH') else 0 
body = env['wsgi.input'].read(l) if l > 0 else '' 

यह कोड उत्पादन में काम करता है।

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