Доступ к данным POST из WSGI
Я не могу понять, как получить доступ к данным POST с помощью WSGI. Я попробовал пример на веб-сайте wsgi.org, и это не сработало. Я использую Python 3.0 прямо сейчас. Пожалуйста, не рекомендуется использовать среду WSGI, поскольку это не то, что я ищу.
Я хотел бы выяснить, как получить его в объект fieldstorage.
Ответы
Ответ 1
Предполагая, что вы пытаетесь получить только данные 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
)
Ответ 2
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.
Ответ 3
Это сработало для меня (в Python 3.0):
import urllib.parse
post_input = urllib.parse.parse_qs(environ['wsgi.input'].readline().decode(),True)
Ответ 4
Еще короче
l = int(env.get('CONTENT_LENGTH')) if env.get('CONTENT_LENGTH') else 0
body = env['wsgi.input'].read(l) if l > 0 else ''
Этот код работает в процессе производства.
Ответ 5
Я бы предложил вам посмотреть, как некоторые структуры делают это для примера. (Я не рекомендую ни одного, просто использую их в качестве примера.)
Вот код из Werkzeug:
http://dev.pocoo.org/projects/werkzeug/browser/werkzeug/wrappers.py#L150
который вызывает
http://dev.pocoo.org/projects/werkzeug/browser/werkzeug/utils.py#L1420
Это немного сложно обобщить здесь, поэтому я не буду.