如何从中间件和烧瓶请求中的请求访问wsgi参数没有副作用?

时间:2012-10-22 19:26:39

标签: python python-2.7 flask wsgi webob

我需要在加载烧瓶应用之前从wsgi请求中读取一些值。如果我从wsgi请求中读取url,我可以在加载烧瓶应用程序后(中间件运行后)访问该文件而没有任何问题。

但是如果我尝试访问params,它似乎会在加载烧瓶应用程序后删除帖子数据。我甚至用一个特殊的Webob请求来包装wsgi请求以防止这种“一次读取”问题。

有没有人知道如何在中间件中访问wsgi请求中的值而不会对请求造成任何副作用损害,这样您就可以在烧瓶应用中获取发布数据/文件数据?

from webob import Request

class SomeMiddleware(object):

    def __init__(self, environ):
        self.request = Request(environ)
        self.orig_environ = environ

    def apply_middleware(self):
        print self.request.url #will not do any harm
        print self.request.params #will cause me to lose data

这是我的烧瓶视图

    @app.route('/')
    def hello_world():
        from flask import request
        the_file = request.files['file']
        print "and the file is", the_file

1 个答案:

答案 0 :(得分:2)

据我所知,这是WSGI工作方式的限制。该流只需消费一次PEP 3333333仅要求流支持read*来电,tell不需要支持)。一旦流耗尽,就无法进一步“向内”重新流式传输到其他WSGI应用程序。有关更多信息,请查看Werkzeug文档的这两部分:

  1. http://werkzeug.pocoo.org/docs/request_data/
  2. http://werkzeug.pocoo.org/docs/http/#module-werkzeug.formparser
  3. 避免此问题的方法是将输入流wsgi.input)包装在实现readreadline方法的对象中。然后,只有当链中的最终应用程序实际上试图耗尽流时,才会运行您的方法。有关此模式的示例,请参阅Flask's documentation on generating a request checksum

    话虽如此,您确定中间件是解决问题的最佳方法吗?如果您需要根据请求的正文的内容执行某些操作(调度,日志记录,身份验证),最好将其作为应用程序的一部分,而不是单独使用应用自己的。