从蓝图中更改jinja_env

3 投票
2 回答
2430 浏览
提问于 2025-04-18 06:57

我正在尝试在我的蓝图中使用 Blueprint 对象注册一个新的 jinja 全局变量。但是,似乎 Blueprint 对象没有 jinja_env 属性;我该如何注册一个新的 jinja 全局属性呢?

这是蓝图的 __init__.py 文件,这个方法不行:

from flask import Blueprint, current_app

uploader = Blueprint('uploader', __name__, template_folder='templates')

from . import views
from . import models

current_app.jinja_env.globals['form_token'] = views.generate_form_token

这个方法也不行:

uploader.jinja_env.globals['form_token'] = views.generate_form_token

2 个回答

0

我在使用Flask和Jinja 2时遇到了类似的问题,主要是注册全局模板时,使用app_template_global装饰器遇到了麻烦。

我使用了add_app_template_global装饰器,具体可以参考这里的Flask API文档

下面的代码适用于Flask(0.10.1)蓝图和Jinja2(2.8)。这是__init__.py文件的内容。

from flask import Blueprint
blueprint_name = Blueprint('blueprint_name', __name__) 

from . import views

在主文件中给函数添加装饰器[在我的情况下是views.py]。这是views.py文件的内容。

from . import blueprint_name

@blueprint_name.add_app_template_global
def function_name():
    pass

然后你可以在Jinja2模板中这样调用这个函数:

<h1>
    {{ function_name() }}
<h1>
5

使用 Blueprint.app_template_global 装饰器可以把一个全局函数注册到 jinja 环境中。

uploader.app_template_global(views.generate_form_token)

或者在 views.py 文件中:

@uploader.app_template_global
def generate_form_token():
    pass

撰写回答