前言
来啦老铁!
笔者近期在工作中遇到将测试数据可视化的需求,且在Python语言背景下,当时借用的是团队既有经验,即:
模板引擎技术
而模板引擎使用:Jinja2
看过笔者的Spring Boot全家桶系列文章的同学一定不会陌生,我们曾在文章Spring Boot视图技术中,一起学习了java体系下的视图技术(模板引擎技术),咱们今天也来学习学习Python体系下的模板引擎技术吧!
学习路径
常见的Python模板引擎有哪些?
Jinja2简介;
Jinja2入门使用;
Jinja2的基础知识点;
1. 常见的Python模板引擎有哪些?
首先我们来看看网上的大佬们都玩过哪些Python的模板引擎吧:
pyTemplate
pyTenjin
Tornado.template
PyJade
Genshi
Django
Smarty
Mako
Jinja2
等。
这么多?笔者只听过Django和Jinja2,孤陋寡闻了,有兴趣的朋友请移步百度~
2. Jinja2简介;
1). Jinja2介绍:
jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用。
2). Jinja2的优点:
相对于Template,jinja2更加灵活,它提供了控制结构,表达式和继承等;
相对于Mako,jinja2仅有控制结构,不允许在模板中编写太多的业务逻辑;
相对于Django模板,jinja2性能更好;
Jinja2模板的可读性很棒。
3. Jinja2入门使用;
话不多说,咱直接开整,代码仓库:
我们直接开始撸一个简单的渲染例子,当然,在使用Jinja2前,需要安装Jinja2哟:
pip3 install jinja2
1). 创建模板文件;
模板文件即html文件,我们在项目内创建一个python包,如resources包,在resources包内创建一个模板文件夹templates,用于存放Jinja模板,最后在templates文件夹下创建一模板文件如:jinja2_demo_1.html;
2). 编写模板文件;
在jinja2_demo_1.html文件中,编写简单的Jinja模板,代码如下:
Jinja2-demo-1INDEXSTATUSMESSAGECREATED_WHEN
{ {index}}{ {status}}{ {message}}{ {created_when}}我们会发现,模板中没有写死的数据,而是以{ {}}符号包裹变量,如果这时候直接浏览器打开resources/templates/jinja2_demo_1.html文件,效果为:
浏览器打开模板文件
没错,就是个模板而已,没有真实值。接下来我们就来将{ {}}符号包裹变量变成我们想展示的值吧!
3). 创建模板渲染逻辑处理类;
在项目根目录下创建一个python包,如utils包,在包内创建一个python类,如reportUtil.py,类中编写一简单的模板渲染逻辑,如下:
#!/usr/local/bin/python3
# -*- coding:utf-8 -*-
__author__ = "diren"
__date__ = "2021-01-03 15:50"
import os
import time
from jinja2 import Environment, PackageLoader
class ReportUtil:
def __init__(self):
pass
def create_jinja2_demo_1_html(self):
index = 1
status = "成功"
message = "这是一个测试文本"
created_when = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
env = Environment(loader=PackageLoader('resources', 'templates'))
template_name = "jinja2_demo_1.html"
template = env.get_template(template_name)
html = template.render(index=index, message=message, created_when=created_when, status=status)
current_dir = os.getcwd()
output_dir = os.path.join(current_dir, "../resources/output/")
if not os.path.exists(output_dir):
os.mkdir(output_dir)
os.chdir(output_dir)
fo = open(template_name, "w")
fo.writelines(html)
fo.close()
os.chdir(current_dir)
print(f"create {template_name}:", "完成")
if __name__ == "__main__":
ReportUtil().create_jinja2_demo_1_html()
这里稍微讲解一下我们的目的:
我们希望通过reportUtil.py,将一组数据渲染进resources/templates/jinja2_demo_1.html文件中表格的第一行;
渲染的数据为:
index = 1
status = "成功"
message = "这是一个测试文本"
created_when = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
渲染后的文件存储于resources/output/jinja2_demo_1.html中,
渲染预期为一个简单表格;
4). 项目整体结构;
项目整体结构
5). 演示;
运行reportUtil.py,我们能看到resources包下生成了一个output文件夹,output文件夹下有一个html文件:jinja2_demo_1.html,该文件就是我们在reportUtil.py渲染出来的静态html文件:
渲染html
浏览器打开resources/output/jinja2_demo_1.html文件:
浏览器访问html
嗯,没错,原来{ {}}符号包裹的变量,均变成我们reportUtil.py代码中想渲染的真实值了,渲染演示成功!是不是很简单呀!
上述,演示了一个非常简单的Jinja2使用方法,接下来我们一起来边学习Jinja2的常用功能,边码代码、边演示、边学习吧!
4. Jinja2的基础知识点;
这里罗列一下基础知识点:
基本语法;
运算符;
转义方法;
测试器;
如何在模版页面中引入静态文件?
过滤器;
宏;
模板继承;
1). 基本语法;
注释 {#...#}
例如:{#这是一个注释#},这一行代码是不会被渲染、处理的,起注释作用;
变量取值 { {...}}
如上面的例子, { {}}是占位符,Jinja2渲染时会将这些占位符替换成真实值。它支持python中的所有数据类型,如字符串、字典、列表等。
控制结构 {%