Jinja2 模板引擎中的宏(Macro)是一种非常强大的功能,它允许开发者定义可重用的代码块,类似于编程语言中的函数。宏可以带有参数,也可以不带参数,它们可以封装复杂的逻辑,使得模板更加清晰和易于维护。

宏的定义

宏的定义以 {% macro %} 开始,以 {% endmacro %} 结束。例如,可以定义一个简单的宏来生成 HTML 输入框:

{% macro input(name, value='', type='text', size=20) -%}
<input type="{{ type }}" name="{{ name }}" value="{{ value|e }}" size="{{ size }}">
{%- endmacro %}
在这个例子中,input 是宏的名称,namevaluetypesize 是宏的参数,其中 valuetypesize 有默认值。宏的结束标签使用了 -%},这表示宏结束后不会输出换行符,这是 Jinja2 中的一个语法糖,用于控制模板的输出格式 。

宏的使用

宏可以在模板中像函数一样被调用:

<p>{{ input('username') }}</p>
<p>{{ input('password', type='password') }}</p>
这将分别生成一个文本输入框和一个密码输入框。

宏的参数和变量

宏可以接收位置参数和关键字参数。如果传入的参数多于宏定义的参数,多余的位置参数会被存储在 varargs 变量中;多余的关键字参数会被存储在 kwargs 变量中。此外,如果宏通过 {% call %} 标签被调用,调用者的内容可以通过 caller() 函数访问 。

宏的导入

宏可以定义在单独的文件中,并在其他模板中通过 {% from %} 语句导入。例如,如果有一个宏定义在 macros.html 文件中,可以在其他模板中这样导入并使用它:

{% from 'macros.html' import my_macro %}
{{ my_macro() }}
这种方式使得宏可以在多个模板之间共享和重用。

宏的高级用法

宏还支持一些高级用法,比如 varargskwargs,它们允许宏接收任意数量的位置参数和关键字参数。此外,宏可以通过 {% call %} 标签被调用,这允许宏内部调用外部的代码块,并且可以传递参数给这个代码块 。

宏是 Jinja2 中处理重复代码和复杂逻辑的强大工具,它们使得模板更加模块化和可维护。通过合理使用宏,可以大大提高模板的复用性和清晰度 。