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代码可以得到相同的结果,这里不再展示。
参考资料
- http://docs.jinkan.org/docs/jinja2/templates.html#id19
- https://www.cnblogs.com/two-peanuts/p/11341367.html
Jinja2中怎么使用宏?相关推荐
- 编写一个头文件,头文件中定义一个宏cube(x)用于求一个数的平方
<程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p145 7.1.2 上级实训内容 [实现内容17]编写一个头文件,头文件中定义一个宏cube(x)用于 ...
- C++头文件中预编译宏的目的
C++头文件中预编译宏的目的 eg: #ifndef _FACTORY_H_ #define _FACTORY_H_ ...... #endif //~_FACTORY_H_ 防止头文件被重复包含,导 ...
- VC中的TRACE宏:
VC中的TRACE宏: TRACE宏对于VC下程序调试来说是很有用的东西,有着类似printf的功能:该宏仅仅在程序的DEBUG版本中出现,当RELEASE的时候该宏就完全消失了,从而帮助你调式也在R ...
- 为什么VS(visual studio)中会建议宏 #define 转换为constexpr?
如图: 原因: 宏是由预处理器而非编译器解析的,比如不能用命名空间,所以使用后必须解除 以及宏很容易带来各式各样的错误,最简单如括号上的错误,还有宏会导致debug困难等等 参考文章:为什么VS中会建 ...
- 怎样在设计中添加FIFO宏模块
quartus软件内置了很多我们经常用到的电路模块,统称为宏模块,在做EDA设计的时候,我们可以直接调用他们来简化设计过程.不要小看了宏模块,如果利用得当,可以省去你一多半的设计时间呢.这里以FIFO ...
- python展开 c函数中的宏预处理_C中的预处理宏
C中的预处理宏 宏定义就属于预处理命令的一种.那么,什么是宏呢? 宏:c语言标准允许在程序中用一个标识符来表示一个字符串.标识符就是宏名. 宏替换:宏替换就是宏定义.在编译预处理中,将程序中所有的宏名 ...
- Linux kernel中常见的宏整理
0x00 宏的基本知识 // object-like #define 宏名 替换列表 换行符 //function-like #define 宏名 ([标识符列表]) 替换列表 换行符 替换列表和标识 ...
- C语言中预定义宏的应用
__LINE__ 在源代码中插入当前源代码行号 __FILE__ 在源代码中插入当前源代码文件名 ...
- c语言宏定义比较三个数大小,C语言中两个宏进行大小对比,其中一个没有定义,这种行为如何定义。...
1.C语言中两个宏进行大小对比,其中一个没有定义,这种行为如何定义呢? 在学习U-boot的过程中遇到这么一个定义: # if (CONFIG_ENV_ADDR >= CONFIG_SYS_MO ...
最新文章
- python画折线图详解-python如何画折线图
- 我的网站-广西信息平台_广西虚拟主机
- 【Linux】Linux 目录结构
- 提高篇 第二部分 字符串算法 第3章 Trie字典树
- Python tarfile模块(压缩解压tar)
- efinance获取基金、股票、债券、期货K线数据
- mysql更换主键遇到的一个问题
- 什么是阿里云服务器系统盘和数据盘?
- 最小二乘方法和RANSAC的改进算法PROSAC和LMEDS
- 【强化学习】CARLA——Windows安装
- 解决“访问 IIS 元数据库失败”的方法
- 【C语言】新手入门的C语言经典实例(持续更新)
- css中 div圆角边框样式,DIV+CSS圆角边框 - 前端LOVER - 博客园
- 三菱伺服驱动器说明书_干货——PLC控制伺服系统(伺服电机)
- 联想服务器系统初始化失败怎么回事,win10重置初始化失败怎么解决
- 数据安全“考题”怎么破解?11月2日厦门站算力私享会开启
- 简体中文转换为繁体中文
- mysql 开启 thread pool_MySQL線程池(THREAD POOL)的處理
- 如何真正做好客户管理
- guid分区怎么装win7_如何在GUID分区装win7系统并以UEFI启动?
热门文章
- python按列索引提取文件夹内所有excel指定列汇总
- 惠普服务器raid卡型号,【HP RAID卡 381513-B21】报价_参数_图片_论坛_(HP)惠普HP RAID卡 381513-B21服务器配件报价-ZOL中关村在线...
- 在ubuntu16.04上运行ROS获取D415深度图像
- cadence allegro学习记录(四)
- SEGA 将在 L2 Oasys 网络上推出区块链纸牌游戏
- java支票金额转换
- 【LOJ6569】仙人掌计数
- vue 实现手写电子签名/生成图片
- 两位程序员 + 60天 = 玩到停不下来的H5游戏!
- 手游开发如何选择后端服务