Jinja2中怎么使用宏?

  Jinja2中的宏的作用类似于常规编程语言中的函数,可以把需要频繁使用的行为定义为一个函数,减少代码复杂度。

1. 宏的定义

  Jinja2中宏的定义以{% macro %}开始,{% endmacro %}为结束。以如下代码为例进行说明:

{% macro def_p(name,age) %}
<p>This is {{name}},He is {{age}} years old.</p>
{% endmacro %}

其中def_p相当于常规编程语言中的函数名,name和age则相当于常规编程语言中的函数参数。
  这里要注意一点,参考资料1中宏的定义是以{% macro -%}开始,{%- endmacro %}结束,与上述定义相比,多了两个-。这种写法也是合法的。从下文的实验结果中可以看到,加了-之后,宏之后的空行将会消失。

2. 宏的使用
2.1 常规使用

  既然Jinja2中宏类似于函数,自然也可以类似函数调用的方式来使用宏,不过要使用{{……}}将函数体包起来。具体如下:
test_jinjia2.html

<!--定义宏:不加短横-->
{% macro def_p(name,age) %}
<p>This is {{name}},He is {{age}} years old.</p>
{% endmacro %}
<!--定义宏:加短横-->
{% macro def_p1(name,age) -%}
<p>This is {{name}},He is {{age}} years old.</p>
{%- endmacro %}

<html lang="en">
<head>
    <title>My Webpage</title>
</head>
<body>
<!--宏的使用:不加短横-->
{{ def_p(name,age) }}
{{ def_p(user['name'],user['age']) }}
{{ def_p(user_list[0],user_list[1]) }}
<!--宏的使用:加短横-->
{{ def_p1(name,age) }}
{{ def_p1(user['name'],user['age']) }}
{{ def_p1(user_list[0],user_list[1]) }}
</body>
</html>

python主函数代码如下:

from jinja2 import loaders, FileSystemLoader, Environment
# 指定模板文件搜索的开始位置
templateLoader=FileSystemLoader(searchpath="./",encoding='utf-8')
templateEnv=Environment(loader=templateLoader)
# 这里的文件位置是以searchpath做为基准的
template=templateEnv.get_template("./test_jinja2.html")
html=template.render(name='James',age=30,user={'name':'Mark','age':40},
                     user_list=['Make',35])#输入参数
print(html)

经过渲染之后的html代码如下:

<!--定义宏:不加短横-->

<!--定义宏:加短横-->


<html lang="en">
<head>
    <title>My Webpage</title>
</head>
<body>
<!--宏的使用:不加短横-->

<p>This is James,He is 30 years old.</p>


<p>This is Mark,He is 40 years old.</p>


<p>This is Make,He is 35 years old.</p>

<!--宏的使用:加短横-->
<p>This is James,He is 30 years old.</p>
<p>This is Mark,He is 40 years old.</p>
<p>This is Make,He is 35 years old.</p>
</body>
</html>
2.2 import引用

  如果宏的定义和宏的使用不在同一个模板文件中,则需要先使用{% from <宏所在文件> import <宏名> %}引入宏的定义再进行使用。
  假设宏的定义在test_1.html文件,而宏在test_jinja2.html文件中使用,则这两个文件的代码如下:
test_1.html

<!--定义宏-->
{% macro def_p(name,age) %}
<p>This is {{name}},He is {{age}} years old.</p>
{% endmacro %}

test_jinja2.html

<html lang="en">
<head>
    <title>My Webpage</title>
</head>
<body>
<!--先引入宏-->
{% from 'test_1.html' import def_p %}
<!--再使用宏-->
{{ def_p(name,age) }}
{{ def_p(user['name'],user['age']) }}
{{ def_p(user_list[0],user_list[1]) }}
</body>
</html>

重新运行python代码可以得到相同的结果,这里不再展示。

参考资料
  1. http://docs.jinkan.org/docs/jinja2/templates.html#id19
  2. https://www.cnblogs.com/two-peanuts/p/11341367.html
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值