Флакон и кодирование передачи: chunked

Мы пытаемся работать с веб-сервисом Flask, и у нас возникают проблемы с потоковыми сообщениями, т. Е. Когда заголовок включает Transfer-Encoding: chunked.

Похоже, флажок по умолчанию не поддерживает 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 < 

И вот вывод сервера Flask:

 * 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([])<------------ 

  • маршал сбрасывается быстрее, cPickle быстрее загружается
  • Наложение числового значения медианы / дисперсии в ящиках
  • не setup.py разработать использовать колесо для install_requires?
  • Функция Django 1.8 'default' выполняет только внешнюю функцию
  • создать лямбда-функцию из строки ** правильно **
  • Можете ли вы обновить версию Python3 QPython3?
  • matplotlib 2d line line, = значение запятой графика
  • недопустимый синтаксис on =?
  • 2 Solutions collect form web for “Флакон и кодирование передачи: chunked”

    Это не Flask Python, его mod_wsgi. Только версии mod_wsgi версии 3.0+ начали поддерживать переданные http-передачи. Flask Python внутренне использует набор инструментов Werkzeug в качестве интерфейса для mod_wsgi. Если вы установили его из источников apt, это может быть старая версия.

    Попробуйте выполнить компиляцию последней версии mod_wsgi, а затем установите флеш-фреймворк, это может решить проблему.

    Это работает для меня, но это не самый элегантный способ ругани. Я использовал метод прилипания тела к окружающей среде реакции.

    Получите исходное тело POST в Python Flask независимо от заголовка Content-Type

    Но добавлен код для обработки парсингового разбора

     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'] 
    Python - лучший язык программирования в мире.