jinja2模块使⽤教程
模板
要了解jinja2,那么需要先理解模板的概念。模板在Python的web开发中⼴泛使⽤,它能够有效的将业务逻辑和页⾯逻辑分开,使代码可读性增强、并且更加容易理解和维护。
模板简单来说就是⼀个其中包涵占位变量表⽰动态的部分的⽂件,模板⽂件在经过动态赋值后,返回给⽤户。 --> 可以理解为渲染
python中⾃带⼀个简单的模板,就是string提供的。
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之所以被⼴泛使⽤是因为它具有以下优点:
1. 相对于Template,jinja2更加灵活,它提供了控制结构,表达式和继承等。
2. 相对于Mako,jinja2仅有控制结构,不允许在模板中编写太多的业务逻辑。
3. 相对于Django模板,jinja2性能更好。
4. Jinja2模板的可读性很棒。
安装jinja2
由于jinja2属于第三⽅模块,⾸先需要对其进⾏安装
1pip3 install jinja2
测试模板是否安装成功
1 2 3 4python -c "import jinja2" # 没有报错就表⽰安装成功# 必须⽤双引号"
jinja2语法
作为⼀个模板系统,它还提供了特殊的语法,我们按照它⽀持的语法进⾏编写之后,就能使⽤jinja2模块进⾏渲染。基本语法
在jinja2中,存在三种语法:
1.
1. 控制结构 {% %}
2. 变量取值 {{ }}
3. 注释 {# #}
下⾯是⼀个简单的jinja2例⼦
1 2 3 4 5 6{# This is jinja code
{% for file in filenames %} ...
{% endfor %}
#}
6
7
#}
可以看到,for循环的使⽤⽅式和Python⽐较类似,但是没有了句尾的冒号,另外需要使⽤endfor最为结尾,其实在jinja2中,if也是⼀样的,结尾需要使⽤endif。
jinja2变量
jinja2模板中使⽤ {{ }} 语法表⽰⼀个变量,它是⼀种特殊的占位符。当利⽤jinja2进⾏渲染的时候,它会把这些特殊的占位符进⾏填充/替换,jinja2⽀持python中所有的Python数据类型⽐如列表、字段、对象等。
1 2 3<p>this is a dicectory:{{ mydict['key'] }} </p>
<p>this is a list:{{ mylist[3] }} </p>
<p>this is a object:{{ myobject.something() }} </p> jinja2中的过滤器
变量可以通过“过滤器”进⾏修改,过滤器可以理解为是jinja2⾥⾯的内置函数和字符串处理函数。
常⽤的过滤器有:
过滤器名称说明
safe渲染时值不转义
capitialize把值的⾸字母转换成⼤写,其他⼦母转换为⼩写
lower把值转换成⼩写形式
upper把值转换成⼤写形式
title把值中每个单词的⾸字母都转换成⼤写
trim把值的⾸尾空格去掉
striptags渲染之前把值中所有的HTML标签都删掉
join 拼接多个值为字符串
replace替换字符串的值
round默认对数字进⾏四舍五⼊,也可以⽤参数进⾏控制
int 把值转换成整型
那么如何使⽤这些过滤器呢?只需要在变量后⾯使⽤管道(|)分割,多个过滤器可以链式调⽤,前⼀个过滤器的输出会作为后⼀个过滤器的输⼊。
{{ '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关键字。
python round函数怎么使用{% if daxin.safe %}
daxin is safe.
{% elif daxin.dead %}
daxin is dead
{% else %}
daxin is okay
{% endif %}
jinja2的for循环
jinja2中的for循环⽤于迭代Python的数据类型,包括列表,元组和字典。在jinja2中不存在while循环。
迭代列表
<ul>
{% for user in users %}
<li>{{ user.username|title }}</li>
{% endfor %}
</ul>
迭代字典
<dl>
{% for key, value in my_dict.iteritems() %}
<dt>{{ key }}</dt>
<dd>{{ value}}</dd>
{% endfor %}
</dl>
当然也可以加⼊else语句,在循环正确执⾏完毕后,执⾏
在for循环中,jinja2还提供了⼀些特殊的变量,⽤以来获取当前的遍历状态:
变量描述
loop.index当前迭代的索引(从1开始)
loop.index0当前迭代的索引(从0开始)
loop.first是否是第⼀次迭代,返回bool
loop.last是否是最后⼀次迭代,返回bool
loop.length序列中的项⽬数量
jinja2的宏
宏类似于Python中的函数,我们在宏中定义⾏为,还可以进⾏传递参数,就像Python中的函数⼀样⼀样⼉的。
在宏中定义⼀个宏的关键字是macro,后⾯跟其宏的名称和参数等
{% macro input(name,age=18) %} # 参数age的默认值为18
<input type='text' name="{{ name }}" value="{{ age }}" >
{% endmacro %}
调⽤⽅法也和Python的类似
<p>{{ input('daxin') }} </p>
<p>{{ input('daxin',age=20) }} </p>
jinja2的继承和Super函数
jinja2中最强⼤的部分就是模板继承。模板继承允许我们创建⼀个基本(⾻架)⽂件,其他⽂件从该⾻架⽂件继承,然后针对⾃⼰需要的地⽅进⾏修改。
jinja2的⾻架⽂件中,利⽤block关键字表⽰其包涵的内容可以进⾏修改。
以下⾯的⾻架⽂件base.html为例:
<!DOCTYPE html>
<html lang="en">
<head>
{% block head %}
<link rel="stylesheet" href="style.css"/>
<title>{% block title %}{% endblock %} - My Webpage</title>
{% endblock %}
</head>
<body>
<div id="content">{% block content %}{% endblock %}</div>
<div id="footer">
{% block footer %}
<script>This is javascript code </script>
{% endblock %}
</div>
</body>
</html>
这⾥定义了四处 block,即:head,title,content,footer。那怎么进⾏继承和变量替换呢?注意看下⾯的⽂件
{% extend "base.html" %} # 继承base.html⽂件
{% block title %} Dachenzi {% endblock %} # 定制title部分的内容
{% block head %}
{{ super() }} # ⽤于获取原有的信息
<style type='text/css'>
.important { color: #FFFFFF }
</style>
{% endblock %}
# 其他不修改的原封不同的继承
PS: super()函数表⽰获取block块中定义的原来的内容。
利⽤jinja2进⾏渲染
jinja2模块中有⼀个名为Enviroment的类,这个类的实例⽤于存储配置和全局对象,然后从⽂件系统或其他位置中加载模板。基本使⽤⽅法
⼤多数应⽤都在初始化的时候撞见⼀个Environment对象,并⽤它加载模板。Environment⽀持两种加载⽅式:
1. PackageLoader:包加载器
2. FileSystemLoader:⽂件系统加载器
PackageLoader
使⽤包加载器来加载⽂档的最简单的⽅式如下:
from jinja2 import PackageLoader,Environment
env = Environment(loader=PackageLoader('python_project','templates')) # 创建⼀个包加载器对象
template = _template('bast.html') # 获取⼀个模板⽂件
其中:
1. PackageLoader()的两个参数为:python包的名称,以及模板⽬录名称。
2. get_template():获取模板⽬录下的某个具体⽂件。
3. render():接受变量,对模板进⾏渲染
FileSystemLoader
⽂件系统加载器,不需要模板⽂件存在某个Python包下,可以直接访问系统中的⽂件。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论