gpt4 book ai didi

python - 如何在没有副作用的情况下从中间件内部的请求和 flask 请求访问 wsgi 参数?

转载 作者:行者123 更新时间:2023-11-28 17:49:25 25 4
gpt4 key购买 nike

我需要在加载 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

这是我的 flask View

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

最佳答案

据我所知,这是 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

避免此问题的方法是将输入流 (wsgi.input) 包装在一个实现readreadline 方法。然后,只有当链中的最终应用程序实际尝试耗尽流时,您的方法才会运行。参见 Flask's documentation on generating a request checksum有关此模式的示例。

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

关于python - 如何在没有副作用的情况下从中间件内部的请求和 flask 请求访问 wsgi 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13018375/

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