Посмотрите на ссылку , раздел Block Nesting and Scope
:
Блоки могут быть вложены для более сложных макетов.Однако блоки по умолчанию могут не иметь доступа к переменным из внешних областей: причина этого в том, что если блок будет заменен дочерним шаблоном, появится переменная, которая не была определена в блоке или передана в контекст.
Согласно документу и начиная с Jinja 2.2, вы можете изменить это поведение, используя scoped
.
{% set foo="bar" %}
{% block content scoped %}
{% include 'include.jinja2' %}
{% endblock content %}
Я согласен, что это несколько странно по сравнению с тем, к чему мы привыкли.Но это преднамеренная особенность.
Вообще говоря, include - это только передаваемый контекст.Начиная с версии 2.1 ему передается производный контекст, который является исходным контекстом + все локальные переменные, используемые перед оператором include.Это также означает, что если вы просто используете переменную из внешней области видимости, Jinja2 теперь будет отслеживать ее как локальную и передавать ее в производный контекст.