转置: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相关推荐

  1. python logging模块学习

    python 的日志logging模块学习 1.简单的将日志打印到屏幕 import logging logging.debug('This is debug message') logging.in ...

  2. python 各种模块学习

    from:https://blog.csdn.net/weiwangchao_/article/details/70570508 转载:.... Python的模块大全,很全,有详细介绍! 另外附Py ...

  3. Python模块学习 - jinja2

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

  4. Python日志模块学习,从这里开始...

    消息与记录 刚才谈到了关于历史账号的文章与消息记录,所以今天想跟大家聊聊Python关于消息记录的模块:日志管理模块 logging. 学习python的第一课,肯定都是print('Hello Wr ...

  5. python Re模块学习

    最近自己学习了正则表达式,自我感觉已经能够满足日常的使用了,需要去了解python提供的匹配正则表达式的工具包,学习参考官方文档,博客相当于笔记,毕竟人家官方文档才是最权威的. 文章目录 一.写在前面 ...

  6. python serial模块学习

    python serial 学习 模块介绍 层次 SerialBase 入参(串口参数) 实例变量 总结 Serialwin32 执行文件选择 主要函数 模块介绍 python对于串口,有封装好的se ...

  7. 【Python】模块学习之ConfigParser读写配置信息

    前言 使用配置文件可以在不修改程序的情况下,做到对程序功能的定制.Python 使用自带的configParser模块可以很方便的读写配置文件的信息. configParser 支持的方法 Confi ...

  8. python zipfile模块学习笔记(一)

    ZIP文件格式是一种常见的存档和压缩标准,这个zipfile模块提供了工具来创建.读取.写入.附加和列出一个ZIP文件.使用ZIP64扩展(即压缩文件大小超过4G),它能解压加密的ZIP文件,解密过程 ...

  9. #Python第三方模块学习笔记(四)——CSV模块功能及主要函数介绍

    声明:本篇文章为转载文章并附有自己的理解,如有冒犯请联系博主立马删除 源地址:https://blog.csdn.net/u012162613/article/details/41915859 1.c ...

  10. python fileinput_Python模块学习:fileinput

    这几天有这样一个需求,要将用户登陆系统的信息统计出来,做成一个报表.当用户登陆成功的时候,服务器会往日志文件里写一条像下面这种格式的记录:"日期时间@用户名@IP",这样的日志文件 ...

最新文章

  1. 不太友好的下载文件提醒
  2. 模型保存的序列化文件pb 什么是PB文件 pb是protocol(协议) buffer(缓冲)的缩写
  3. (022)[工具软件]图片浏览 JPEGView
  4. 在unity调用WebService的接口方法
  5. Spring Boot定时任务-Quartz介绍
  6. Java十大排序算法总结,Java排序算法总结之冒泡排序
  7. Django 使用 mysql 数据库连接
  8. P6348-[PA2011]Journeys【线段树优化建图,最短路】
  9. bob-tong 字符串函数之Strtok()函数
  10. Investigating Div-Sum Property【数位DP】
  11. JAVA 版本微信公众管理开源项目招募伙伴
  12. 12.混淆——采样低频信号,采样高频信号_3
  13. (转载)7个去伪存真的JavaScript面试题
  14. SpringBoot 使用小技巧合集
  15. 怎么用手机修改服务器的网关,网关,手把手教你手机怎么改网关和IP
  16. 一个生成随机密码的WPF小程序
  17. 整数翻转-LeetCode No7
  18. 自动与Internet时间服务器同步
  19. layUi框架入门篇(一)
  20. 在R中统计数据的频数或者密度分布并图形化

热门文章

  1. NBA球队也使用Salesforce?
  2. vue结合elmentui实现前端分页
  3. AntDesign前端分页
  4. 【华为2019年校园招聘】2019-5-8 软件题
  5. 【UCSC Genome Browser】Genes and Gene Predictions - GENCODE
  6. dev:dev fatal: HttpRequestException encountered. remote: Invalid username or password. fatal: Authen
  7. 【HAVENT原创】修改 CentOS 服务器名称
  8. 单独使用mybatis整合mysql案例
  9. Laravel每日一记
  10. OpenShift——openshift 3.11 集群安装(亲测版,你懂的)