2008-12-26 15 views
15

का उपयोग कर पायथन पोस्ट डेटा यह एक बहुत ही सरल सवाल होना चाहिए, लेकिन मुझे लगता है कि यह पता लगाने में सक्षम नहीं है।mod_wsgi

मैं अपने पायथन एप्लिकेशन को होस्ट करने के लिए अपाचे + mod_wsgi का उपयोग कर रहा हूं, और मैं फॉर्म में से किसी एक में सबमिट की गई सामग्री को प्राप्त करना चाहता हूं- न तो पर्यावरण मान, न ही sys.stdin में इनमें से कोई भी डेटा है । मुझे एक त्वरित हाथ दे रहा है?

संपादित करें: पहले से ही की कोशिश की:

  • वातावरण [ "CONTENT_TYPE"] = 'आवेदन/x-www फार्म-urlencoded' (कोई डेटा)
  • वातावरण [ "wsgi.input"] लगता है एक व्यावहारिक तरीका, हालांकि, दोनों वातावरण ["wsgi.input"]।(), और वातावरण ["wsgi.input"] पढ़ें। (-1) एक खाली स्ट्रिंग देता है (हाँ, सामग्री पोस्ट की गई है, और वातावरण [ "request_method"] = "पोस्ट"

उत्तर

22

PEP 333you must read environ['wsgi.input'] कहते हैं।

मैंने अभी निम्न कोड सहेजा है और apache के mod_wsgi इसे चलाया है। यह काम करता हैं।

आपको कुछ गलत करना होगा।

from pprint import pformat 

def application(environ, start_response): 
    # show the environment: 
    output = ['<pre>'] 
    output.append(pformat(environ)) 
    output.append('</pre>') 

    #create a simple form: 
    output.append('<form method="post">') 
    output.append('<input type="text" name="test">') 
    output.append('<input type="submit">') 
    output.append('</form>') 

    if environ['REQUEST_METHOD'] == 'POST': 
     # show form data as received by POST: 
     output.append('<h1>FORM DATA</h1>') 
     output.append(pformat(environ['wsgi.input'].read())) 

    # send results 
    output_len = sum(len(line) for line in output) 
    start_response('200 OK', [('Content-type', 'text/html'), 
           ('Content-Length', str(output_len))]) 
    return output 
+0

हमारे पास विजेता है! धन्यवाद :) –

+2

यह मेरे लिए अवरुद्ध है। यह बाइट्स की सटीक संख्या को पढ़कर हल किया गया था: 'length = int (environ.get ('CONTENT_LENGTH', '0')) 'और' ... पढ़ें (लंबाई) '। यह इस तथ्य के अनुरूप है कि समर्थित होने के लिए * प्रलेखन * पढ़ने '('लंबाई') (कोई लंबाई नहीं) का उल्लेख किया गया है। – EOL

13

ध्यान रखें कि तकनीकी तौर पर पढ़ा कॉल() या wsgi.input पर पढ़ें (-1) है WSGI विनिर्देश भले ही अपाचे/mod_wsgi यह अनुमति देता है का उल्लंघन। ऐसा इसलिए है क्योंकि डब्लूएसजीआई विनिर्देश की आवश्यकता है कि वैध लंबाई तर्क प्रदान किया जाए। डब्लूएसजीआई विनिर्देश यह भी कहता है कि आपको CONTENT_LENGTH द्वारा निर्दिष्ट किए गए डेटा से अधिक डेटा नहीं पढ़ना चाहिए।

तो, ऊपर दिया गया कोड अपाचे/mod_wsgi में काम कर सकता है लेकिन यह पोर्टेबल डब्लूएसजीआई कोड नहीं है और कुछ अन्य डब्लूएसजीआई कार्यान्वयन पर असफल हो जाएगा। सही होने के लिए, अनुरोध सामग्री की लंबाई निर्धारित करें और उस मान को पढ़ने के लिए आपूर्ति करें()।

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