当在Jinja2块中包含文件时,我很难理解上下文行为。参见以下最小示例:
base.jinja2
{% set foo="bar" %}
{% block content %}
{% include 'include.jinja2' %}
{% endblock content %}
include.jinja2
{{ foo }}
渲染 base.jinja2 会产生错误foo' is undefined
。
当我将foo
的声明移到content
块中时,代码将正确呈现。当我将include
语句移到content
块外,删除content
语句周围的include
块或替换{{1 }}声明文件的内容。
那是为什么?如何在 content 块内的包含文件中使用全局 foo 变量?
答案 0 :(得分:1)
查看link的Block Nesting and Scope
部分:
可以为更复杂的布局嵌套块。但是,默认情况下 块可能无法访问外部作用域的变量: 原因是如果该块被子代替换 模板,将出现一个未在块中定义的变量,或者 传递给上下文。
根据文档并从Jinja 2.2开始,您可以使用scoped
更改此行为。
{% set foo="bar" %}
{% block content scoped %}
{% include 'include.jinja2' %}
{% endblock content %}
与过去相比,我同意这有点怪异。但这是预期的功能。
通常来说,include仅通过上下文。从2.1开始 传递了派生的上下文,即原始上下文+所有本地 在include语句之前使用的变量。这也意味着 您只是使用来自外部作用域的变量,Jinja2会将其跟踪为 立即本地化并将其传递到派生上下文。