Данные POST Python с использованием mod_wsgi

Это должен быть очень простой вопрос, но я, похоже, не могу понять.

Я использую apache + mod_wsgi для размещения моего приложения python, и я хотел бы получить содержимое сообщения, представленное в одной из форм - во всяком случае, ни значения среды, ни sys.stdin не содержат ни одной из этих данных. Разум дает мне быструю руку?

Изменить: Пробовал уже:

  • environ [ "CONTENT_TYPE" ] = 'application/x-www-form-urlencoded' (нет данных)
  • environ [ "wsgi.input" ] кажется правдоподобным, однако, как environment [ "wsgi.input" ]. read(), так и environment [ "wsgi.input" ]. read (-1) возвращает пустую строка (да, содержимое было опубликовано, а environ [ "request_method" ] = "post"

Ответы

Ответ 1

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

Ответ 2

Помните, что технически говорящий вызов read() или read (-1) на wsgi.input является нарушением спецификации WSGI, даже если Apache/mod_wsgi позволяет это. Это связано с тем, что спецификация WSGI требует предоставления допустимого аргумента длины. Спецификация WSGI также говорит, что вы не должны читать больше данных, чем указано CONTENT_LENGTH.

Таким образом, приведенный выше код может работать в Apache/mod_wsgi, но он не является переносимым WSGI-кодом и не будет работать в некоторых других реализациях WSGI. Чтобы быть точным, определите длину содержимого запроса и укажите это значение для чтения().