Tor*_*ups 5 python wsgi webob flask python-2.7
在加载我的 Flask 应用程序之前,我需要从 wsgi 请求中读取一些值。如果我从 wsgi 请求中读取了 url,则在加载 Flask 应用程序后(在中间件运行之后),我可以毫无问题地访问该文件。
但是,如果我尝试访问参数,它似乎会在加载 Flask 应用程序后删除发布数据。我什至走极端,用一个特殊的 Webob 请求来包装 wsgi 请求,以防止这个“只读一次”问题。
有谁知道如何在中间件中访问来自 wsgi 请求的值而不会对请求造成任何副作用,以便您可以在 Flask 应用程序中获取发布数据/文件数据?
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
Run Code Online (Sandbox Code Playgroud)
这是我的烧瓶视图
@app.route('/')
def hello_world():
from flask import request
the_file = request.files['file']
print "and the file is", the_file
Run Code Online (Sandbox Code Playgroud)
据我所知,这是 WSGI 工作方式的限制。该流只需要被消费一次(PEP 333和3333只要求该流支持read*调用,tell不需要支持)。一旦流耗尽,它就无法进一步“向内”重新流式传输到其他 WSGI 应用程序。查看 Werkzeug 文档的这两部分以获取更多信息:
避免此问题的方法是将输入流( ) 包装在实现和方法wsgi.input的对象中。然后,只有当链中的最后一个应用程序实际尝试耗尽流时,您的方法才会运行。有关此模式的示例,请参阅Flask 中有关生成请求校验和的文档。readreadline
话虽这么说,您确定中间件是解决您问题的最佳方案吗?如果您需要根据请求正文的内容执行某些操作(调度、日志记录、身份验证) ,您最好将其作为应用程序的一部分,而不是单独的应用程序。
| 归档时间: |
|
| 查看次数: |
2197 次 |
| 最近记录: |