Jinja2-将宏分解为多个文件

Bri*_*unt 4 jinja2

给定一个文件中大量的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 %}
Run Code Online (Sandbox Code Playgroud)

在其他地方,我使用导入import "macros.html" as macros

我想分解macros.html成多个文件,例如A.htmlB.html在本示例中,如下所示:

A.html

{% macro A_1() %} A_1 {% endmacro %}
{% macro A_2() %} A_2 {% endmacro %}
{% macro A_3() %} A_3 {% endmacro %}
Run Code Online (Sandbox Code Playgroud)

B.html

{% macro B_1() %} B_1 {% endmacro %}
{% macro B_1() %} B_1 {% endmacro %}
Run Code Online (Sandbox Code Playgroud)

但是,我希望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 %}
Run Code Online (Sandbox Code Playgroud)

似乎有些奏效的唯一选择是:

{% import "A.html" as XYZ %}
{% set A_1 = XYZ.A_1 %}
Run Code Online (Sandbox Code Playgroud)

不幸的是,在这种情况下,中的宏A.html无法从主文件访问全局宏,这与将宏全部包含在中时的行为不同macros.html

但是,无论如何无论如何都会有很多不必要的重复,因为我将为导入的每个文件有效地导入匿名模块名称,以访问并手动命名其每个宏成员。

似乎应该有一个更好的选择。

我考虑过的一种方法是编写自己的文件加载器,以加载和连接宏指令。基本上是一个从头开始创建“ macros.html”的预处理器。

Nic*_*kel 5

您可以使用扩展继承自现有的宏文件。如果在“ A”中从“ B”继承,然后将“ A”导入到页面中,则可以调用B的宏,就好像它们是文件“ A”的一部分一样,而无需在页面中进行额外的导入。根据您的要求,它看起来将是相同的文件。这是这样做的:

{% extends 'macrosdir/file.html' %}
Run Code Online (Sandbox Code Playgroud)