2013-01-03 16 views
9

हम फ्लास्क वेब सेवा काम कर रहे हैं, और हमें स्ट्रीमिंग पोस्ट के साथ कुछ समस्याएं आ रही हैं - यानी हेडर में स्थानांतरण-एन्कोडिंग शामिल है: खंडित।फ्लास्क और ट्रांसफर-एन्कोडिंग:

ऐसा लगता है कि डिफ़ॉल्ट फ्लास्क HTTP 1.1 का समर्थन नहीं करता है। क्या इसके आसपास कोई कार्य है?

हम इस आदेश को चला रहे हैं:

$ curl -v -X PUT --header "Transfer-Encoding: chunked" -d @pylucene-3.6.1-2-src.tar.gz "http://localhost:5000/async-test" 

इस कोड के खिलाफ:

@app.route("/async-test", methods=['PUT']) 
def result(): 
    print '------->'+str(request.headers)+'<------------' 
    print '------->'+str(request.data)+'<------------' 
    print '------->'+str(request.form)+'<------------' 
    return 'OK' 

यहाँ कर्ल उत्पादन है:

$ curl -v -X PUT --header "Transfer-Encoding: chunked" -d @pylucene-3.6.1-2-src.tar.gz "http://localhost:5000/async-test" 
* About to connect() to localhost port 5000 (#0) 
* Trying ::1... Connection refused 
* Trying 127.0.0.1... connected 
* Connected to localhost (127.0.0.1) port 5000 (#0) 
> PUT /async-test HTTP/1.1 
> User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5 
> Host: localhost:5000 
> Accept: */* 
> Transfer-Encoding: chunked 
> Content-Type: application/x-www-form-urlencoded 
> Expect: 100-continue 
> 
* HTTP 1.0, assume close after body 
< HTTP/1.0 200 OK 
< Content-Type: text/html; charset=utf-8 
< Content-Length: 2 
< Server: Werkzeug/0.8.3 Python/2.7.1 
< Date: Wed, 02 Jan 2013 21:43:24 GMT 
< 

और यहाँ बोतल सर्वर उत्पादन है:

* Running on 0.0.0.0:5000/ 
------->Transfer-Encoding: chunked 
Content-Length: 
User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5 
Host: localhost:5000 
Expect: 100-continue 
Accept: */* 
Content-Type: application/x-www-form-urlencoded 

<------------ 
-------><------------ 
------->ImmutableMultiDict([])<------------ 
+0

पर प्राप्त करने के लिए आप कभी भी इस के लिए एक समाधान मिला chunked से निपटने के लिए कोड जोड़ा? –

+0

मुझे अधिसूचनाएं चालू नहीं करनी चाहिए, इसलिए मुझे अब तक यह टिप्पणी नहीं दिखाई दे रही है। Waqas का जवाब सही है; हमने टेस्ट कोड जावा पर ले जाया। –

उत्तर

3

यह फ्लास्क पायथन नहीं है, इसकी mod_wsgi है। केवल mod_wsgi संस्करण 3.0+ ने खंडित http स्थानान्तरण का समर्थन करना शुरू किया। Flask Python आंतरिक रूप से mod_wsgi के लिए एक इंटरफ़ेस के रूप में Werkzeug टूल-किट का उपयोग करें। यदि आपने इसे उपयुक्त स्रोतों से स्थापित किया है तो यह एक पुराना संस्करण हो सकता है।

mod_wsgi के नवीनतम संस्करण को संकलित करने का प्रयास करें और फिर फ्लास्क ढांचे को स्थापित करें, इससे समस्या हल हो सकती है।

1

यह मेरे लिए काम करता है लेकिन यह shimming chunked पार्सिंग shimming का सबसे सुरुचिपूर्ण तरीका नहीं है। मैंने प्रतिक्रिया के पर्यावरण में शरीर को चिपकाने की विधि का उपयोग किया।

Get raw POST body in Python Flask regardless of Content-Type header

लेकिन पार्स करने

class WSGICopyBody(object): 
    def __init__(self, application): 
     self.application = application 

    def __call__(self, environ, start_response): 
     from cStringIO import StringIO 
     input = environ.get('wsgi.input') 
     length = environ.get('CONTENT_LENGTH', '0') 
     length = 0 if length == '' else int(length) 
     body = '' 
     if length == 0: 
      environ['body_copy'] = '' 
      if input is None: 
       return 
      if environ.get('HTTP_TRANSFER_ENCODING','0') == 'chunked': 
       size = int(input.readline(),16) 
       while size > 0: 
        body += input.read(size+2) 
        size = int(input.readline(),16) 
     else: 
      body = environ['wsgi.input'].read(length) 
     environ['body_copy'] = body 
     environ['wsgi.input'] = StringIO(body) 

     # Call the wrapped application 
     app_iter = self.application(environ, 
            self._sr_callback(start_response)) 

     # Return modified response 
     return app_iter 

    def _sr_callback(self, start_response): 
     def callback(status, headers, exc_info=None): 

      # Call upstream start_response 
      start_response(status, headers, exc_info) 
     return callback 


app.wsgi_app = WSGICopyBody(app.wsgi_app) 

उपयोग यह

request.environ['body_copy']