python - 使用要在模板中使用的中间件在 Flask 请求中设置变量

标签 python flask wsgi

根据访问应用程序的路径的第一部分,我希望应用程序以不同的方式呈现。我尝试使用中间件在 request 上设置一个变量,然后在模板中访问它。我打印了一些调试信息,这些信息确实出现了,所以我知道中间件代码运行了,但是一旦我到达模板,该值就没有设置。如何在中间件中设置一个可以在 Flask 中使用的变量?

from werkzeug.wrappers import Request

class NavMiddleware:
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        request = Request(environ)
        print('path: %s, url: %s' % (request.path, request.url))
        
        if request.path.startswith("/myapp"):
            print("Here")
            request.application = "Myapp"
            environ['application'] = "Myapp"
        
        return self.app(environ, start_response)
{% if request.application == "Myapp" %}
    {% include 'navbar_myapp.html' %}
{% endif %}

最佳答案

您在中间件中创建的 request 对象与 Flask 构建的 request 对象无关。只有 environ 在 WSGI 层之间传递。中间件修改后续层看到的请求的正确方法是修改 environ dict。您已经这样做了,因此您需要访问 request.environ 中的值,而不是 request 对象本身。

class NavMiddleware:
    def __init__(self, app, app_name):
        self.app = app
        self.app_name = app_name

    def __call__(self, environ, start_response):
        request = Request(environ)
        first_path = request.path.lstrip("/").partition("/")[0]
        environ["nav_middleware.app_name"] = first_path
        return self.app(environ, start_response)

app = Flask(__name__)
app.wsgi_app = NavMiddleware(app.wsgi_app, "my_app")
{% if request.environ["nav_middleware.app_name"] == "my_app" %}
这个答案一般适用于中间件,但在这种特殊情况下不需要中间件。 WSGI 服务器可以在不同的 SCRIPT_NAME 位置挂载应用程序,该位置公开为 request.script_root 。您可以使用 Werkzeug 的 DispatcherMiddleware 在 dev 中模拟这一点。
app = Flask(__name__)
app.wsgi_app = DispatcherMiddleware(app, {"/one": app, "/two": app})
{% if request.script_root == "/one" %}

关于python - 使用要在模板中使用的中间件在 Flask 请求中设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64788107/

相关文章:

python - 在 pytorch 中计算 `loss.backward` 的多重损失性能吗?

python - Flask-restplus:有什么方法可以大摇大摆地对命名空间进行排序?

python - 读取发送到 Flask 服务器的 zip 文件而不将其存储在磁盘上

python - 部署 Flask,并行请求

python - pip:错误:没有名为 pip uninstall 的命令

python - 从 python 并行写入 MongoDb 集合

python - 接受参数 : Missing 1 required positional argument 的 flask get 方法

python - WSGI- python : How to determine the ** OPENED ** file's image type?

python - Tornado 中的电子商务(非阻塞)VS Flask (WSGI)

python - 如何从pyspark中的数组中提取元素