Доступ к данным POST из WSGI - PullRequest
33 голосов
/ 10 февраля 2009

Я не могу понять, как получить доступ к данным POST, используя WSGI. Я попробовал пример на сайте wsgi.org, и он не сработал. Я использую Python 3.0 прямо сейчас. Пожалуйста, не рекомендуйте среду WSGI, так как это не то, что я ищу.

Я хотел бы выяснить, как получить его в объект полевого хранилища.

Ответы [ 5 ]

29 голосов
/ 15 февраля 2009

Предполагается, что вы пытаетесь получить только данные POST в объект FieldStorage:

# env is the environment handed to you by the WSGI server.
# I am removing the query string from the env before passing it to the
# FieldStorage so we only have POST data in there.
post_env = env.copy()
post_env['QUERY_STRING'] = ''
post = cgi.FieldStorage(
    fp=env['wsgi.input'],
    environ=post_env,
    keep_blank_values=True
)
22 голосов
/ 10 февраля 2009
body= ''  # b'' for consistency on Python 3.0
try:
    length= int(environ.get('CONTENT_LENGTH', '0'))
except ValueError:
    length= 0
if length!=0:
    body= environ['wsgi.input'].read(length)

Обратите внимание, что WSGI еще не полностью указан для Python 3.0, и большая часть популярной инфраструктуры WSGI не была преобразована (или была 2to3d, но не была должным образом протестирована). (Даже wsgiref.simple_server не будет работать.) Сегодня у вас трудное время для WSGI 3.0.

4 голосов
/ 15 октября 2009

Это сработало для меня (в Python 3.0):

import urllib.parse

post_input = urllib.parse.parse_qs(environ['wsgi.input'].readline().decode(),True)
2 голосов
/ 16 марта 2017

еще короче

l = int(env.get('CONTENT_LENGTH')) if env.get('CONTENT_LENGTH') else 0
body = env['wsgi.input'].read(l) if l > 0 else ''

Этот код работает в производстве.

0 голосов
/ 10 февраля 2009

Я бы посоветовал вам посмотреть, как это делают некоторые фреймворки для примера. (Я не рекомендую ни одного, просто использую их в качестве примера.)

Вот код из Werkzeug :

http://dev.pocoo.org/projects/werkzeug/browser/werkzeug/wrappers.py#L150

который звонит

http://dev.pocoo.org/projects/werkzeug/browser/werkzeug/utils.py#L1420

Здесь немного сложно подвести итог, поэтому я не буду.

...