Я создаю простой веб-сервис, требующий подписи всех запросов.Хэш подписи генерируется с использованием данных запроса, включая тело запроса.Я хочу иметь компонент промежуточного программного обеспечения, который проверяет подпись запроса и отвечает ошибкой, если подпись недействительна.Проблема заключается в том, что промежуточному программному обеспечению необходимо прочитать тело запроса, используя 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)