Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2012-12-08

Flask request data

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

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Klaipeda (15) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) Baltic (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) seaside (1) serialization (1) shore (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)