Python- jinja2模块详解

简介: Python- jinja2模块详解

要了解jinja2,那么需要先理解模板的概念。模板在Python的web开发中广泛使用,它能够有效的将业务逻辑和页面逻辑分开,使代码可读性增强、并且更加容易理解和维护。

  模板简单来说就是一个其中包涵占位变量表示动态的部分的文件,模板文件在经过动态赋值后,返回给用户。 --> 可以理解为渲染

  python中自带一个简单的模板,就是string提供的。

1
2
3
4
5
6
7

import string
a = string.Template('$who is $role')
a.substitute(who='daxin',role='Linux')
'daxin is Linux'
a.substitute(who='daxin',role='cat')
'daxin is cat'

  Python自带的模板功能极其有限,如果我们想要在模板中使用控制语句,和表达式,以及继承等功能的话,就无法实现了。

  目前主流的模板系统,最常用的就是jinja2和mako

jinja2介绍
  jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用。

jinja2的优点
  jinja2之所以被广泛使用是因为它具有以下优点:

相对于Template,jinja2更加灵活,它提供了控制结构,表达式和继承等。
相对于Mako,jinja2仅有控制结构,不允许在模板中编写太多的业务逻辑。
相对于Django模板,jinja2性能更好。
Jinja2模板的可读性很棒。
安装jinja2
  由于jinja2属于第三方模块,首先需要对其进行安装

1
pip3 install jinja2
  测试模板是否安装成功

1
2
3
4
python -c "import jinja2"

没有报错就表示安装成功

必须用双引号"

jinja2语法
  作为一个模板系统,它还提供了特殊的语法,我们按照它支持的语法进行编写之后,就能使用jinja2模块进行渲染。

基本语法
  在jinja2中,存在三种语法:

控制结构 {% %}
变量取值 { { }}
注释 {# #}
  下面是一个简单的jinja2例子

1
2
3
4
5
6
7
{# This is jinja code

{% for file in filenames %}
...
{% endfor %}

//代码效果参考:https://v.youku.com/v_show/id_XNjQwMDM0NjM2OA==.html

}

  可以看到,for循环的使用方式和Python比较类似,但是没有了句尾的冒号,另外需要使用endfor最为结尾,其实在jinja2中,if也是一样的,结尾需要使用endif。

jinja2变量
  jinja2模板中使用 { { }} 语法表示一个变量,它是一种特殊的占位符。当利用jinja2进行渲染的时候,它会把这些特殊的占位符进行填充/替换,jinja2支持python中所有的Python数据类型比如列表、字段、对象等。

1
2
3

this is a dicectory:{ { mydict['key'] }}

this is a list:{ { mylist[3] }}

this is a object:{ { myobject.something() }}


jinja2中的过滤器
  变量可以通过“过滤器”进行修改,过滤器可以理解为是jinja2里面的内置函数和字符串处理函数。

  常用的过滤器有:

过滤器名称 说明
safe 渲染时值不转义
capitialize 把值的首字母转换成大写,其他子母转换为小写
lower 把值转换成小写形式
upper 把值转换成大写形式
title 把值中每个单词的首字母都转换成大写
trim 把值的首尾空格去掉
striptags 渲染之前把值中所有的HTML标签都删掉
join 拼接多个值为字符串
replace 替换字符串的值
round 默认对数字进行四舍五入,也可以用参数进行控制
int 把值转换成整型
  那么如何使用这些过滤器呢? 只需要在变量后面使用管道(|)分割,多个过滤器可以链式调用,前一个过滤器的输出会作为后一个过滤器的输入。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{ { 'abc' | captialize }}

Abc

{ { 'abc' | upper }}

ABC

{ { 'hello world' | title }}

Hello World

{ { "hello world" | replace('world','daxin') | upper }}

HELLO DAXIN

{ { 18.18 | round | int }}

18

jinja2的控制结构
  jinja2中的if语句类似与Python的if语句,它也具有单分支,多分支等多种结构,不同的是,条件语句不需要使用冒号结尾,而结束控制语句,需要使用endif关键字。

1
2
3
4
5
6
7
{% if daxin.safe %}
daxin is safe.
{% elif daxin.dead %}
daxin is dead
{% else %}
daxin is okay
{% endif %}
jinja2的for循环
  jinja2中的for循环用于迭代Python的数据类型,包括列表,元组和字典。在jinja2中不存在while循环。
//代码效果参考:https://v.youku.com/v_show/id_XNjQwNjgwMDkxMg==.html

  迭代列表

1
2
3
4
5


  • {% for user in users %}

  • { { user.username|title }}

  • {% endfor %}

  迭代字典

1
2
3
4
5
6


{% for key, value in my_dict.iteritems() %}
{ { key }}

{ { value}}

{% endfor %}
相关文章
|
3天前
|
传感器 JSON 监控
python中psutil模块的使用详解(python3经典编程案例)
这篇文章介绍了如何使用Python的`pyinstaller`库打包应用程序,并提供了详细的打包步骤和参数说明。
21 7
|
2天前
|
前端开发 Python
python之【Tkinter模块】
python之【Tkinter模块】
11 5
|
2天前
|
Python
|
3天前
|
安全 Python 容器
Python中好用的模块-collections
文章介绍了Python中collections模块的几个实用组件,包括Counter、defaultdict、OrderedDict、namedtuple、deque和ChainMap的功能与使用方法。
15 2
|
3天前
|
关系型数据库 MySQL Python
pymysql模块,python与MySQL之间的交互
pymysql模块,python与MySQL之间的交互
|
3天前
|
Unix Linux 网络安全
python中连接linux好用的模块paramiko(附带案例)
该文章详细介绍了如何使用Python的Paramiko模块来连接Linux服务器,包括安装配置及通过密码或密钥进行身份验证的示例。
9 1
|
3天前
|
API 语音技术 开发者
用python实现文字转语音的5个较好用的模块
这篇文章介绍了五个Python模块:gtts、pyttsx3、baidu-aip、pywin32和speech,它们能够实现文本到语音的转换功能。
10 1
|
18天前
|
Java Serverless Python
探索Python中的并发编程与`concurrent.futures`模块
探索Python中的并发编程与`concurrent.futures`模块
16 4
|
1天前
|
Python
7-14|salt之安装Python模块
7-14|salt之安装Python模块
|
30天前
|
API Python
python ratelimit模块
python ratelimit模块