我需要在加载烧瓶应用之前从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
答案 0 :(得分:2)
据我所知,这是WSGI工作方式的限制。该流只需消费一次(PEP 333且3333仅要求流支持read*
来电,tell
不需要支持)。一旦流耗尽,就无法进一步“向内”重新流式传输到其他WSGI应用程序。有关更多信息,请查看Werkzeug文档的这两部分:
避免此问题的方法是将输入流(wsgi.input
)包装在实现read
和readline
方法的对象中。然后,只有当链中的最终应用程序实际上试图耗尽流时,才会运行您的方法。有关此模式的示例,请参阅Flask's documentation on generating a request checksum。
话虽如此,您确定中间件是解决问题的最佳方法吗?如果您需要根据请求的正文的内容执行某些操作(调度,日志记录,身份验证),最好将其作为应用程序的一部分,而不是单独使用应用自己的。