Учитывая большое количество макросов Jinja2 в файле, назовем его macros.html
.
Я хотел бы разбить этот файл на несколько файлов меньшего размера, но чтобы он выглядел одинаково внешне, когда я вызываю его с помощью import
.
Так, например, предположим, что у меня есть
macros.html
{% macro A_1() %} A_1 {% endmacro %}
{% macro A_2() %} A_2 {% endmacro %}
{% macro A_3() %} A_3 {% endmacro %}
{% macro B_1() %} B_1 {% endmacro %}
{% macro B_1() %} B_1 {% endmacro %}
В другом месте я импортирую это с помощью import "macros.html" as macros
.
Я хотел бы разбить macros.html
на несколько файлов, таких как A.html
и B.html
в этом примере, вот так:
A.html
{% macro A_1() %} A_1 {% endmacro %}
{% macro A_2() %} A_2 {% endmacro %}
{% macro A_3() %} A_3 {% endmacro %}
B.html
{% macro B_1() %} B_1 {% endmacro %}
{% macro B_1() %} B_1 {% endmacro %}
Однако я хотел бы, чтобы файлы, которые использовали macros.html
, могли по-прежнему включать его в import "macros.html" as macros
.
Я пробовал несколько вещей, но они не работали, как ожидалось. Обычно я получаю сообщение об ошибке jinja2.environment.TemplateModule object has no attribute 'A_1'
при выполнении любого из следующих действий в macros.html
{% include "A.html" %}
{# or #}
{% from "A.html" import A_1 %}
Единственный вариант, который, кажется, несколько работает:
{% import "A.html" as XYZ %}
{% set A_1 = XYZ.A_1 %}
К сожалению, в этом случае макросы в A.html
не могут получить доступ к глобальным макросам из основного файла, что отличается от поведения, когда макросы были включены все в macros.html
.
В любом случае, там происходит много ненужного повторения, поскольку я бы эффективно импортировал имена анонимных модулей для каждого файла, импортированного только для доступа и ручного присвоения имени каждому из его макроэлементов.
Кажется, должен быть лучший вариант.
Один из них, который я рассматривал, — это написание моего собственного загрузчика файлов, который загружает и объединяет набор макросов. В основном препроцессор, который создает "macros.html" с нуля.