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().

Другие вопросы по тегам