首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python WSGI:多次读取env['wsgi.input']

Python WSGI:多次读取env['wsgi.input']
EN

Stack Overflow用户
提问于 2011-05-23 03:56:16
回答 2查看 1.9K关注 0票数 5

我正在构建一个简单的web服务,要求所有的请求都要签名。签名散列是使用包括请求正文的请求数据生成的。我希望有一个中间件组件来验证请求签名,如果签名无效,就用错误响应。问题是中间件需要使用env'wsgi.input'.read()读取请求正文。这会将请求正文字符串的指针前移到末尾,从而使执行链中其他更低层的组件无法访问数据。

有没有办法让env'wsgi.input‘可以读两次?

例如:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-23 03:59:53

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

票数 3
EN

Stack Overflow用户

发布于 2011-05-23 07:16:10

下面的规范处理了这个确切的问题,提供了问题的解释以及解决方案,包括源代码和要考虑的特殊情况:http://wsgi.readthedocs.org/en/latest/specifications/handling_post_forms.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6090377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档