Python WSGI: чтение env ['wsgi.input'] более одного раза - PullRequest
4 голосов
/ 22 мая 2011

Я создаю простой веб-сервис, требующий подписи всех запросов.Хэш подписи генерируется с использованием данных запроса, включая тело запроса.Я хочу иметь компонент промежуточного программного обеспечения, который проверяет подпись запроса и отвечает ошибкой, если подпись недействительна.Проблема заключается в том, что промежуточному программному обеспечению необходимо прочитать тело запроса, используя env ['wsgi.input']. Read ().Это продвигает указатель для строки тела запроса до конца, что делает данные недоступными для других компонентов далее в цепочке выполнения.

Есть ли способ сделать это так env ['wsgi.input'] можно прочитать дважды?

Пример:

from myapp.lib.helpers import sign_request
from urlparse import parse_qs
import json

class ValidateSignedRequestMiddleware(object):
    def __init__(self, app, secret):
        self._app = app
        self._secret = secret

    def __call__(self, environ, start_response):
        auth_params = environ['HTTP_AUTHORIZATION'].split(',', 1)
        timestamp = auth_params[0].split('=', 1)[1]
        signature = auth_params[1].split('=', 1)[1]

        expected_signature = sign_request(
            environ['REQUEST_METHOD'],
            environ['HTTP_HOST'],
            environ['PATH_INFO'],
            parse_qs(environ['QUERY_STRING']),
            environ['wsgi.input'].read(),
            timestamp,
            self._secret
        )
        if signature != expected_signature:
            start_response('400 Bad Request', [('Content-Type', 'application/json')])
            return [json.dumps({'error': ('Invalid request signature',)})]

        return self._app(environ, start_response)

Ответы [ 2 ]

3 голосов
/ 22 мая 2011

Вы можете попробовать вернуться к началу, но, возможно, вам придется заменить его на StringIO, содержащий то, что вы только что прочитали.

1 голос
/ 23 мая 2011

Следующая спецификация касается именно этой проблемы, предоставляя объяснение проблемы, а также решение, включая исходный код и особые случаи, которые необходимо учитывать: http://wsgi.readthedocs.org/en/latest/specifications/handling_post_forms.html

...