我正在构建一个简单的Web服务,要求对所有请求进行签名。使用包括请求主体的请求数据来生成签名散列。我的愿望是拥有一个验证请求签名的中间件组件,如果签名是无效的,则会返回错误。问题是中间件需要使用env ['wsgi.input']。read()读取请求主体。这会将请求正文字符串的指针推进到结尾,这使得执行链中其他组件无法访问数据。Python WSGI:多次读取env ['wsgi.input']
有什么办法让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)
可能重复[如何复制wsgi.input如果我想多次处理POST数据?](http://stackoverflow.com/questions/1783383/how-do-i-copy-wsgi-input-if-i-want-to-process-post-data - 不止一次) – 2011-05-22 19:59:28