??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则相当于常规编程语言中的函数参数。
2. 宏的使用
??既然Jinja2中宏类似于函数,自然也可以类似函数调用的方式来使用宏,不过要使用{{……}}将函数体包起来。具体如下: test_jinjia2.html
{% macro def_p(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]) }}
</body>
</html>
python主函数代码如下:
from jinja2 import loaders, FileSystemLoader, Environment
templateLoader=FileSystemLoader(searchpath="./",encoding='utf-8')
templateEnv=Environment(loader=templateLoader)
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>
</body>
</html>
??如果宏的定义和宏的使用不在同一个模板文件中,则需要先使用{% 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代码可以得到相同的结果,这里不再展示。
参考
- http://docs.jinkan.org/docs/jinja2/templates.html#id19
在这里插入代码片 - https://www.cnblogs.com/two-peanuts/p/11341367.html
|