python jinja2_Python模块学习 - jinja2
转置:https://www.cnblogs.com/dachenzi/p/8242713.html
模板
要了解jinja2,那么需要先理解模板的概念。模板在Python的web开发中广泛使用,它能够有效的将业务逻辑和页面逻辑分开,使代码可读性增强、并且更加容易理解和维护。
模板简单来说就是一个其中包涵占位变量表示动态的部分的文件,模板文件在经过动态赋值后,返回给用户。 --> 可以理解为渲染
python中自带一个简单的模板,就是string提供的。
Python自带的模板功能极其有限,如果我们想要在模板中使用控制语句,和表达式,以及继承等功能的话,就无法实现了。
目前主流的模板系统,最常用的就是jinja2和mako
jinja2介绍
jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用。
jinja2的优点
jinja2之所以被广泛使用是因为它具有以下优点:
相对于Template,jinja2更加灵活,它提供了控制结构,表达式和继承等。
相对于Mako,jinja2仅有控制结构,不允许在模板中编写太多的业务逻辑。
相对于Django模板,jinja2性能更好。
Jinja2模板的可读性很棒。
安装jinja2
由于jinja2属于第三方模块,首先需要对其进行安装
测试模板是否安装成功
jinja2语法
作为一个模板系统,它还提供了特殊的语法,我们按照它支持的语法进行编写之后,就能使用jinja2模块进行渲染。
基本语法
在jinja2中,存在三种语法:
控制结构 {% %}
变量取值 {{ }}
注释 {# #}
下面是一个简单的jinja2例子
可以看到,for循环的使用方式和Python比较类似,但是没有了句尾的冒号,另外需要使用endfor最为结尾,其实在jinja2中,if也是一样的,结尾需要使用endif。
jinja2变量
jinja2模板中使用 {{ }} 语法表示一个变量,它是一种特殊的占位符。当利用jinja2进行渲染的时候,它会把这些特殊的占位符进行填充/替换,jinja2支持python中所有的Python数据类型比如列表、字段、对象等。
jinja2中的过滤器
变量可以通过“过滤器”进行修改,过滤器可以理解为是jinja2里面的内置函数和字符串处理函数。
常用的过滤器有:
过滤器名称
说明
safe
渲染时值不转义
capitialize
把值的首字母转换成大写,其他子母转换为小写
lower
把值转换成小写形式
upper
把值转换成大写形式
title
把值中每个单词的首字母都转换成大写
trim
把值的首尾空格去掉
striptags
渲染之前把值中所有的HTML标签都删掉
join
拼接多个值为字符串
replace
替换字符串的值
round
默认对数字进行四舍五入,也可以用参数进行控制
int
把值转换成整型
那么如何使用这些过滤器呢? 只需要在变量后面使用管道(|)分割,多个过滤器可以链式调用,前一个过滤器的输出会作为后一个过滤器的输入。
jinja2的控制结构
jinja2中的if语句类似与Python的if语句,它也具有单分支,多分支等多种结构,不同的是,条件语句不需要使用冒号结尾,而结束控制语句,需要使用endif关键字。
jinja2的for循环
jinja2中的for循环用于迭代Python的数据类型,包括列表,元组和字典。在jinja2中不存在while循环。
迭代列表
迭代字典
当然也可以加入else语句,在循环正确执行完毕后,执行
在for循环中,jinja2还提供了一些特殊的变量,用以来获取当前的遍历状态:
变量
描述
loop.index
当前迭代的索引(从1开始)
loop.index0
当前迭代的索引(从0开始)
loop.first
是否是第一次迭代,返回bool
loop.last
是否是最后一次迭代,返回bool
loop.length
序列中的项目数量
loop.revindex
到循环结束的次数(从1开始)
loop.revindex0
到循环结束的次数(从0开始)
jinja2的宏
宏类似于Python中的函数,我们在宏中定义行为,还可以进行传递参数,就像Python中的函数一样一样儿的。
在宏中定义一个宏的关键字是macro,后面跟其 宏的名称和参数等
调用方法也和Python的类似
jinja2的继承和Super函数
jinja2中最强大的部分就是模板继承。模板继承允许我们创建一个基本(骨架)文件,其他文件从该骨架文件继承,然后针对自己需要的地方进行修改。
jinja2的骨架文件中,利用block关键字表示其包涵的内容可以进行修改。
以下面的骨架文件base.html为例:
这里定义了四处 block,即:head,title,content,footer。那怎么进行继承和变量替换呢?注意看下面的文件
PS: super()函数 表示获取block块中定义的原来的内容。
利用jinja2进行渲染
jinja2模块中有一个名为Enviroment的类,这个类的实例用于存储配置和全局对象,然后从文件系统或其他位置中加载模板。
基本使用方法
大多数应用都在初始化的时候撞见一个Environment对象,并用它加载模板。Environment支持两种加载方式:
PackageLoader:包加载器
FileSystemLoader:文件系统加载器
PackageLoader
使用包加载器来加载文档的最简单的方式如下:
其中:
PackageLoader()的两个参数为:python包的名称,以及模板目录名称。
get_template():获取模板目录下的某个具体文件。
render():接受变量,对模板进行渲染
FileSystemLoader
文件系统加载器,不需要模板文件存在某个Python包下,可以直接访问系统中的文件。
jinja_demo.py:
from jinja2 import Environment, FileSystemLoader
import os.path
# __file__ 就是本文件的名字
# 得到放置模板的目录
path = '{}/templates/'.format(os.path.dirname(__file__))
# 创建一个加载器, jinja2 会从这个目录中加载模板
loader = FileSystemLoader(path)
# 用加载器创建一个环境, 有了它才能读取模板文件
env = Environment(loader=loader)
# 调用 get_template() 方法加载模板并返回
template = env.get_template('demo.html')
# 用 render() 方法渲染模板
# 可以传递参数
ns = list(range(3))
us = [
{
'id': 1,
'name': 'gua',
},
{
'id': 2,
'name': '瓜',
},
]
print(template.render(name='gua', numbers=ns, users=us)
demo.html:
jinja demo
{{ name }}
{% for n in numbers %}
{{ n }}
{% endfor %}
{% for u in users %}
{{ u.name }}
{{ u.id }}
{% endfor %}
python jinja2_Python模块学习 - jinja2相关推荐
- python logging模块学习
python 的日志logging模块学习 1.简单的将日志打印到屏幕 import logging logging.debug('This is debug message') logging.in ...
- python 各种模块学习
from:https://blog.csdn.net/weiwangchao_/article/details/70570508 转载:.... Python的模块大全,很全,有详细介绍! 另外附Py ...
- Python模块学习 - jinja2
模板 要了解jinja2,那么需要先理解模板的概念.模板在Python的web开发中广泛使用,它能够有效的将业务逻辑和页面逻辑分开,使代码可读性增强.并且更加容易理解和维护. 模板简单来说就是一个其中 ...
- Python日志模块学习,从这里开始...
消息与记录 刚才谈到了关于历史账号的文章与消息记录,所以今天想跟大家聊聊Python关于消息记录的模块:日志管理模块 logging. 学习python的第一课,肯定都是print('Hello Wr ...
- python Re模块学习
最近自己学习了正则表达式,自我感觉已经能够满足日常的使用了,需要去了解python提供的匹配正则表达式的工具包,学习参考官方文档,博客相当于笔记,毕竟人家官方文档才是最权威的. 文章目录 一.写在前面 ...
- python serial模块学习
python serial 学习 模块介绍 层次 SerialBase 入参(串口参数) 实例变量 总结 Serialwin32 执行文件选择 主要函数 模块介绍 python对于串口,有封装好的se ...
- 【Python】模块学习之ConfigParser读写配置信息
前言 使用配置文件可以在不修改程序的情况下,做到对程序功能的定制.Python 使用自带的configParser模块可以很方便的读写配置文件的信息. configParser 支持的方法 Confi ...
- python zipfile模块学习笔记(一)
ZIP文件格式是一种常见的存档和压缩标准,这个zipfile模块提供了工具来创建.读取.写入.附加和列出一个ZIP文件.使用ZIP64扩展(即压缩文件大小超过4G),它能解压加密的ZIP文件,解密过程 ...
- #Python第三方模块学习笔记(四)——CSV模块功能及主要函数介绍
声明:本篇文章为转载文章并附有自己的理解,如有冒犯请联系博主立马删除 源地址:https://blog.csdn.net/u012162613/article/details/41915859 1.c ...
- python fileinput_Python模块学习:fileinput
这几天有这样一个需求,要将用户登陆系统的信息统计出来,做成一个报表.当用户登陆成功的时候,服务器会往日志文件里写一条像下面这种格式的记录:"日期时间@用户名@IP",这样的日志文件 ...
最新文章
- 不太友好的下载文件提醒
- 模型保存的序列化文件pb 什么是PB文件 pb是protocol(协议) buffer(缓冲)的缩写
- (022)[工具软件]图片浏览 JPEGView
- 在unity调用WebService的接口方法
- Spring Boot定时任务-Quartz介绍
- Java十大排序算法总结,Java排序算法总结之冒泡排序
- Django 使用 mysql 数据库连接
- P6348-[PA2011]Journeys【线段树优化建图,最短路】
- bob-tong 字符串函数之Strtok()函数
- Investigating Div-Sum Property【数位DP】
- JAVA 版本微信公众管理开源项目招募伙伴
- 12.混淆——采样低频信号,采样高频信号_3
- (转载)7个去伪存真的JavaScript面试题
- SpringBoot 使用小技巧合集
- 怎么用手机修改服务器的网关,网关,手把手教你手机怎么改网关和IP
- 一个生成随机密码的WPF小程序
- 整数翻转-LeetCode No7
- 自动与Internet时间服务器同步
- layUi框架入门篇(一)
- 在R中统计数据的频数或者密度分布并图形化
热门文章
- NBA球队也使用Salesforce?
- vue结合elmentui实现前端分页
- AntDesign前端分页
- 【华为2019年校园招聘】2019-5-8 软件题
- 【UCSC Genome Browser】Genes and Gene Predictions - GENCODE
- dev:dev fatal: HttpRequestException encountered. remote: Invalid username or password. fatal: Authen
- 【HAVENT原创】修改 CentOS 服务器名称
- 单独使用mybatis整合mysql案例
- Laravel每日一记
- OpenShift——openshift 3.11 集群安装(亲测版,你懂的)