Python (Flask): How
to get whole raw post body?
To use this, all you
need to do is to hook the calculating stream in before the request
starts consuming data
В качестве
предисловия я использовал две фразы,
которые можно считать ключом к теме
поста. Фразы отсюда
Кроме фраз, я
оттуда использовал и примеры кода,
скомбинировав их в то решение, что
подошло для меня.
Как-то так
получилось (by design), что внутренняя
механика фреймворка Flask
(werkzeug) не дает
простого способа получить данные,
засланные в приложение, в нетронутом
виде. Зачем нужно такой доступ получать
— тема отдельная. Иногда надо
приходится. Читая документацию
невнимательно, можно сделать вывод, что
эти данные можно взять из request.data, но это
не так. Вернее, не совсем так. Если в
запросе был указан Content-type понимаемый
Flask-ом, то данные будут распарсены и
request.data будет пустым. А данные лягут в
словарь request.form — поди собери обратно.
Короче, в тех
редких, но вполне возможных ситуациях,
когда Content-type заставляет Flask парсить
тело запроса, а парсить его нельзя ибо
данные нужны целиком — спасает чтение
из потока request.environ['wsgi.input']. Но учтите,
это тоже не просто. Во первых, надо точно
знать длину потока; во вторых, поток
надо успеть прочесть до того, как
произойдет обращение ко всяким
request.data, request.form и тому подобное (подробнее
см.в доках).
Еще короче —
смотрите пример:
from flask import Flask, url_for, render_template, request app = Flask(__name__) ... @app.route('/kvsproxy', methods=['GET', 'POST']) def kvsproxyPage(): ... if request.method == 'POST': rawdata = getWsgiInput() … def getWsgiInput(): if not request.method == 'POST': return '' env = request.environ stream = env['wsgi.input'] cl = env.get('CONTENT_LENGTH', '0') cl = 0 if cl == '' else int(cl) if cl == 0: return '' return stream.read(cl) |
Вполне работает.
А причина, по
которой надо так извращаться — ошибка,
допущенная мною при написании клиента,
который засылает такие запросы. Клиент
не делает urlencode на строку данных, хотя
в заголовке пишет, что данные закодированы.
И поправлять этого клиента уже поздно,
думать проверять надо было
раньше.
original post http://vasnake.blogspot.com/2012/12/flask-request-data.html
original post http://vasnake.blogspot.com/2012/12/flask-request-data.html
Комментариев нет:
Отправить комментарий