gpt4 book ai didi

python - 渲染 Jinja2 宏而不影响模板的其余部分

转载 作者:太空狗 更新时间:2023-10-29 20:31:31 26 4
gpt4 key购买 nike

在我的第一个 Flask 项目中,我在尝试从 Jinja2 模板渲染宏时偶然发现了 jinja2.exceptions.UndefinedError 异常。事实证明,Jinja2 在尝试解析确实包含对全局请求对象的引用的模板的其余部分时会生成此异常。

这是我用于测试用例的模板 test.html:

<!doctype html>
{% macro test_macro() -%}
Rendered from macro
{%- endmacro %}
{{ request.authorization }}

Flask 代码 #1:渲染模板(成功):

@app.route("/test")
def test_view():
return render_template('test.html')

Flask 代码 #2:渲染宏(失败):

@app.route("/test")
def test_view():
test_macro = get_template_attribute('test.html', 'test_macro')
return test_macro()

如果您从模板中取出 {{ request.authorization }},第二个测试将成功执行。

Flask 代码 #3:使用 workaround I found in the Flask mailing list archive (成功):

@app.route("/test")
def test_view():
t = app.jinja_env.get_template('test.html')
mod = t.make_module({'request': request})
return mod.test_macro()

虽然我现在有一个工作代码,但我发现不知道为什么第二种方法会失败,这让我很不舒服。当 Jinja2 只需要呈现宏时,为什么还要关心模板的其余部分?

最佳答案

你是对的,这是在 Jinja 方面造成的。 Flask 中的方法 get_template_attribute() 如下所示:

return getattr(current_app.jinja_env.get_template(template_name).module,
attribute)

因此它会尝试检索模板名称,然后调用属性 module 在生成属性列表之前评估此模板。在您的情况下,对变量 request 的引用对于 Jinja 仍然未知。有关更多详细信息,请查看 Jinja's environment.py sources .

关于python - 渲染 Jinja2 宏而不影响模板的其余部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21521566/

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