gpt4 book ai didi

python WSGI : Reading env ['wsgi.input' ] more than once

转载 作者:太空狗 更新时间:2023-10-30 03:07:09 27 4
gpt4 key购买 nike

我正在构建一个简单的 Web 服务,要求对所有请求进行签名。签名哈希是使用包括请求正文的请求数据生成的。我的愿望是拥有一个验证请求签名的中间件组件,如果签名无效则以错误响应。问题是中间件需要使用 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)

最佳答案

您可以尝试回到开头,但您可能会发现您必须将其替换为包含您刚刚读出的内容的 StringIO

关于 python WSGI : Reading env ['wsgi.input' ] more than once,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6090377/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com