jinja2学习总结

jinja2

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

引入jinja2进行渲染

jinja2模块中有一个名为Enviroment的类,这个类的实例用于存储配置和全局对象,然后从文件系统或其他位置中加载模板。

from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('./data/html')) #创建一个文件系统加载器
template = env.get_template('template.html') # 获取一个模板文件
template.render(name='daxin',age=18)   # 渲染 

Environment支持两种加载方式:
PackageLoader:包加载器 from jinja2 import PackageLoader,Environment
FileSystemLoader:文件系统加载器 from jinja2 import Environment, FileSystemLoader

使用

语法

{{ ... }}:装载一个变量,模板渲染的时候,会使用传进来的同名参数这个变量代表的值替换掉。
{% ... %}:装载一个控制语句。
{# ... #}:装载一个注释,模板渲染的时候会忽视这中间的值。

变量 {{}}

显示

jinja2支持python中所有的Python数据类型比如列表、字段、对象等。

<p>this is a dicectory:{{ mydict['key'] }} </p>
<p>this is a list:{{ mylist[3] }} </p>
<p>this is a object:{{ myobject.something() }} </p> 

在模板中添加变量,可以使用(set)语句。

{% set name='xx' %}

局部变量

使用with创建一个内部作用域,将set语句放在其中,创建的变量只在with代码块中才有效。

{% with foo = 42 %}
{{ foo }}
{% endwith %}

if结构

{% if daxin.safe %}
daxin is safe.
{% elif daxin.dead %}
daxin is dead
{% else %}
daxin is okay
{% endif %} 

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

<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% else %}
<li><em>no users found</em></li>
{% endfor %}
</ul>

注:不可以使用continue和break表达式来控制循环的执行
Jinja2中for循环内置常量:

常量含义
loop.index当前迭代的索引(从1开始)
loop.index0当前迭代的索引(从0开始)
loop.first是否是第一次迭代,返回True/False
loop.last是否是最后一次迭代,返回True/False
loop.length序列的长度

特殊运算符

**号运算符:次幂运算符,比如2**3=8
in操作符:跟python中的in一样使用,比如{{1 in [1,2,3]}}返回true。
~号运算符:拼接多个字符串,比如{{"Hello" ~ "World"}}将返回HelloWorld。

过滤器

过滤器名称说明
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 

宏类似于Python中的函数
在宏中定义一个宏的关键字是macro,后面跟宏的名称和参数等

{% macro input(name,age=18) %}   # 参数age的默认值为18
 <input type='text' name="{{ name }}" value="{{ age }}" >
{% endmacro %} 

调用方法

<p>{{ input('daxin') }} </p>
<p>{{ input('daxin',age=20) }} </p> 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值