2009-02-09 2 views
30

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

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

+0

FWIW, на данный момент не существует спецификации WSGI для Python 3.0, поэтому все, что вы делаете, возможно, будет потрачено впустую, поскольку любое окончательное обновление спецификации может быть несовместимо с любыми попытками реализовать то, что он может сказать для Python 3.0 , Для приложений WSGI вам лучше оставаться на Python 2.X. –

+6

@GrahamDumpleton Больше нет: http://www.python.org/dev/peps/pep-3333/ (Давайте не вводим в заблуждение людей, которые читают это чуть позже, как я, тоже экономя время) – JeromeJ

+2

@JermoeJ - Он написал комментарий в 2009 году, и вы отвечаете на него в 2013 году; не думайте, что он пытался ввести кого-либо в заблуждение. :) – Sam

ответ

28

Предполагая, что вы пытаетесь получить только данные 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 
) 
+0

Это не работает в Python 3.0 - у него есть проблема с возвращаемыми байтами wsgi.input вместо строк. :(Мне нужен способ сделать это в Python 3.0 ... –

+0

Какой обработчик WSGI вы используете? Если я использую встроенный CGIHandler, он отлично подходит для меня. У меня есть файл post.cgi мой локальный сервер с содержимым в http://pastebin.com/f40849562 работает нормально. –

+0

Что такое io-класс wsgi.input? Если это BufferedIOBase, тогда вы должны иметь возможность обернуть его в TextIOWrapper, чтобы cgi .FieldStorage может использовать его. –

-1

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

Вот код из Werkzeug:

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

который называет

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

Это бит, сложный для обобщения здесь, поэтому я не буду.

+0

Все еще не работает в Python 3.0, и это то, что я ищу. Спасибо в любом случае. –

+1

-1 вопрос, который не должен отображаться фреймворками –

+2

@FireCrow Глядя на то, как рамки, похоже, являются хорошей идеей. На самом деле это не рекомендуется. – JeromeJ

22
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.

+0

Да, у меня были проблемы с работой wsgiref. Я закончил реализацию патча. –

+0

http://www.python.org/dev/peps/pep-3333/ WSGI PEP для Python 3. – JeromeJ

3

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

import urllib.parse 

post_input = urllib.parse.parse_qs(environ['wsgi.input'].readline().decode(),True) 
1

Даже короткий

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

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

Смежные вопросы