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

Jinja2中怎么使用宏?相关推荐

  1. 编写一个头文件,头文件中定义一个宏cube(x)用于求一个数的平方

    <程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p145 7.1.2 上级实训内容 [实现内容17]编写一个头文件,头文件中定义一个宏cube(x)用于 ...

  2. C++头文件中预编译宏的目的

    C++头文件中预编译宏的目的 eg: #ifndef _FACTORY_H_ #define _FACTORY_H_ ...... #endif //~_FACTORY_H_ 防止头文件被重复包含,导 ...

  3. VC中的TRACE宏:

    VC中的TRACE宏: TRACE宏对于VC下程序调试来说是很有用的东西,有着类似printf的功能:该宏仅仅在程序的DEBUG版本中出现,当RELEASE的时候该宏就完全消失了,从而帮助你调式也在R ...

  4. 为什么VS(visual studio)中会建议宏 #define 转换为constexpr?

    如图: 原因: 宏是由预处理器而非编译器解析的,比如不能用命名空间,所以使用后必须解除 以及宏很容易带来各式各样的错误,最简单如括号上的错误,还有宏会导致debug困难等等 参考文章:为什么VS中会建 ...

  5. 怎样在设计中添加FIFO宏模块

    quartus软件内置了很多我们经常用到的电路模块,统称为宏模块,在做EDA设计的时候,我们可以直接调用他们来简化设计过程.不要小看了宏模块,如果利用得当,可以省去你一多半的设计时间呢.这里以FIFO ...

  6. python展开 c函数中的宏预处理_C中的预处理宏

    C中的预处理宏 宏定义就属于预处理命令的一种.那么,什么是宏呢? 宏:c语言标准允许在程序中用一个标识符来表示一个字符串.标识符就是宏名. 宏替换:宏替换就是宏定义.在编译预处理中,将程序中所有的宏名 ...

  7. Linux kernel中常见的宏整理

    0x00 宏的基本知识 // object-like #define 宏名 替换列表 换行符 //function-like #define 宏名 ([标识符列表]) 替换列表 换行符 替换列表和标识 ...

  8. C语言中预定义宏的应用

    __LINE__                       在源代码中插入当前源代码行号         __FILE__                       在源代码中插入当前源代码文件名 ...

  9. c语言宏定义比较三个数大小,C语言中两个宏进行大小对比,其中一个没有定义,这种行为如何定义。...

    1.C语言中两个宏进行大小对比,其中一个没有定义,这种行为如何定义呢? 在学习U-boot的过程中遇到这么一个定义: # if (CONFIG_ENV_ADDR >= CONFIG_SYS_MO ...

最新文章

  1. python画折线图详解-python如何画折线图
  2. 我的网站-广西信息平台_广西虚拟主机
  3. 【Linux】Linux 目录结构
  4. 提高篇 第二部分 字符串算法 第3章 Trie字典树
  5. Python tarfile模块(压缩解压tar)
  6. efinance获取基金、股票、债券、期货K线数据
  7. mysql更换主键遇到的一个问题
  8. 什么是阿里云服务器系统盘和数据盘?
  9. 最小二乘方法和RANSAC的改进算法PROSAC和LMEDS
  10. 【强化学习】CARLA——Windows安装
  11. 解决“访问 IIS 元数据库失败”的方法
  12. 【C语言】新手入门的C语言经典实例(持续更新)
  13. css中 div圆角边框样式,DIV+CSS圆角边框 - 前端LOVER - 博客园
  14. 三菱伺服驱动器说明书_干货——PLC控制伺服系统(伺服电机)
  15. 联想服务器系统初始化失败怎么回事,win10重置初始化失败怎么解决
  16. 数据安全“考题”怎么破解?11月2日厦门站算力私享会开启
  17. 简体中文转换为繁体中文
  18. mysql 开启 thread pool_MySQL線程池(THREAD POOL)的處理
  19. 如何真正做好客户管理
  20. guid分区怎么装win7_如何在GUID分区装win7系统并以UEFI启动?

热门文章

  1. python按列索引提取文件夹内所有excel指定列汇总
  2. 惠普服务器raid卡型号,【HP RAID卡 381513-B21】报价_参数_图片_论坛_(HP)惠普HP RAID卡 381513-B21服务器配件报价-ZOL中关村在线...
  3. 在ubuntu16.04上运行ROS获取D415深度图像
  4. cadence allegro学习记录(四)
  5. SEGA 将在 L2 Oasys 网络上推出区块链纸牌游戏
  6. java支票金额转换
  7. 【LOJ6569】仙人掌计数
  8. vue 实现手写电子签名/生成图片
  9. 两位程序员 + 60天 = 玩到停不下来的H5游戏!
  10. 手游开发如何选择后端服务