POST-данные Python с использованием mod_wsgi
Это, должно быть, очень простой вопрос, но я, кажется, не могу понять.
Я использую apache + mod_wsgi для размещения своего приложения на python, и я хотел бы получить содержимое публикации, отправленное в одной из форм - однако, ни значения среды, ни sys.stdin не содержат никаких этих данных. Не могли бы вы дать мне быструю руку?
Изменить: уже пробовал:
- environment ["CONTENT_TYPE"] = 'application/x-www-form-urlencoded' (нет данных)
- Среда ["wsgi.input"] выглядит правдоподобным способом, однако, как среда ["wsgi.input"].read(), так и Environment ["wsgi.input"].read(-1) возвращает пустую строку (да, контент был опубликован, и Environment ["request_method"] = "post"
2 ответа
PEP 333 говорит, что вы должны прочитать environment ['wsgi.input'].
Я просто сохранил следующий код и заставил apache mod_wsgi запустить его. Оно работает.
Вы должны делать что-то не так.
from pprint import pformat
def application(environ, start_response):
# show the environment:
output = ['<pre>']
output.append(pformat(environ))
output.append('</pre>')
#create a simple form:
output.append('<form method="post">')
output.append('<input type="text" name="test">')
output.append('<input type="submit">')
output.append('</form>')
if environ['REQUEST_METHOD'] == 'POST':
# show form data as received by POST:
output.append('<h1>FORM DATA</h1>')
output.append(pformat(environ['wsgi.input'].read()))
# send results
output_len = sum(len(line) for line in output)
start_response('200 OK', [('Content-type', 'text/html'),
('Content-Length', str(output_len))])
return output
Имейте в виду, что с технической точки зрения вызов read() или read(-1) в wsgi.input является нарушением спецификации WSGI, хотя Apache/mod_wsgi это позволяет. Это связано с тем, что спецификация WSGI требует указания аргумента допустимой длины. В спецификации WSGI также говорится, что вы не должны читать больше данных, чем указано в CONTENT_LENGTH.
Таким образом, приведенный выше код может работать в Apache/mod_wsgi, но он не является переносимым кодом WSGI и не будет работать в некоторых других реализациях WSGI. Чтобы быть точным, определите длину содержимого запроса и укажите это значение для read().