包含文件的jinja2块的上下文行为

时间:2019-03-26 10:24:20

标签: python django flask jinja2

当在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 变量?

1 个答案:

答案 0 :(得分:1)

查看linkBlock Nesting and Scope部分:

  

可以为更复杂的布局嵌套块。但是,默认情况下   块可能无法访问外部作用域的变量:   原因是如果该块被子代替换   模板,将出现一个未在块中定义的变量,或者   传递给上下文。

根据文档并从Jinja 2.2开始,您可以使用scoped更改此行为。

{% set foo="bar" %}

{% block content scoped %}
{% include 'include.jinja2' %}
{% endblock content %}

与过去相比,我同意这有点怪异。但这是预期的功能。

通常来说,include仅通过上下文。从2.1开始 传递了派生的上下文,即原始上下文+所有本地 在include语句之前使用的变量。这也意味着 您只是使用来自外部作用域的变量,Jinja2会将其跟踪为 立即本地化并将其传递到派生上下文。