一、jinja2过滤器
- 1.内置过滤器
变量可以通过 过滤器 修改。过滤器与变量用管道符号( | )分割,并且也 可以用圆括号传递可选参数。多个过滤器可以链式调用,前一个过滤器的输出会被作为 后一个过滤器的输入。使用方法:{{ 变量名|过滤器名("参数") }}
过滤器 | 说明 |
---|---|
abs | 返回一个数值的绝对值 |
default | 当前变量没有值则返回默认值,boolean=True当变量有值但是值为False(空字符串,空列表,空字典)时返回默认值 |
safe | 可以关闭一个字符串的自动转义, 禁用转义 |
escape | 对某一个字符串进行转义 |
first | 返回一个序列的第一个元素 |
last | 返回最后一个值 |
format | 格式化字符串 |
length | 返回一个序列类型的长度 |
join | 将一个序列,用指定的参数拼接成字符串 |
int | 将值转换为 int 类型 |
float | 将值转换为 float 类型 |
lower | 将字符串转换为小写 |
upper | 将字符串转换为大写 |
string | 将变量转换为字符串 |
replace | 替换字符串replace('原字符串', '新字符串') |
truncate | 截取指定长度的字符串truncate(length=8) |
striptags | 删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格 |
trle | 截取字符串前面和后面的空白字符 |
wordcount | 计算一个长字符串中单词的个数 |
title | 把值中的第个单词的首页字母变成大写 |
captalize | 把变量值的首字母转成大写,其余字母转小写 |
trim | 把值的首尾空格去掉 |
reverse | 字符串的反转 |
sum | 列表求和 |
sort | 列表排序 |
- 2.自定义过滤器
过滤器的本质就是函数,如果在模板中调用这个过滤器,那么就会将这个变量的值作为第一个参数传给过滤器函数,然后将函数的返回值作为滤器的返回值, 在python文件中写好过滤的函数和逻辑,将函数注册到模板过滤器中:@app.template_filter('过滤器名'),在模板中调用过滤器:变量|过滤器名。
@app.template_filter('my_filter')
def add_unit(data, unit)
data = str(data)+unit
return data
在模板中使用:
<p>{{ data|my_filter('%') }}</p>
<p>{{ age|my_filter('岁')}}</p>
二、控制语句
所有的控制语句都是放在{% ... %}中,并且有⼀个语句{% endxxx %}来进⾏结束,Jinja中常⽤的控制语句有if/for..in..
- 1.if控制语句
新建一个app.py实例文件,代码如下:
from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)
@app.route('/if/')
def if_control():
contest = {
'name': 'zhangsan',
'age': 20
}
return render_template('if.html', **contest)
if __name__ == '__main__':
app.run(debug=True)
新建一个if.html文件,代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>if控制语句</title>
</head>
<body>
{% if name %} // 判断name变量是否为真,注意这里变量无需通过{{ 变量名 }}的方式来表示
<p><b>您好,{{ name }}!</b></p>
{% endif %}
{% if age >= 18 %} // 判断age变量是否大于18
<p><b>成年人</b></p>
{% else %}
<p><b>未成年人</b></p>
{% endif %}
</body>
</html>
- 2.for控制语句的装载
新建一个app.py实例文件,代码如下:
from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)
@app.route('/for/')
def for_control():
contest = {
'books': [
{
'name': '三国演义',
'author': '罗贯中',
'price': 70
},
{
'name': '西游记',
'author': '吴承恩',
'price': 70
},
{
'name': '红楼梦',
'author': '曹雪芹',
'price': 70
},
{
'name': '水浒传',
'author': '施耐庵',
'price': 70
}
]
}
return render_template('for.html', **contest)
if __name__ == '__main__':
app.run(debug=True)
新建一个for.html文件,代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>for控制语句</title>
</head>
<body>
<table>
<tr>
<th>书名</th>
<th>作者</th>
<th>价格</th>
</tr>
{% for book in books %}
<tr>
{% for value in book.values() %}
<td>{{ value }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
</body>
</html>
并且Jinja2中的for循环还包含以下变量,可以⽤来获取当前的遍历状态。
变量 | 描述 |
---|---|
loop.index | 当前迭代的索引(从1开始) |
loop.index0 | 当前迭代的索引(从0开始) |
loop.first | 是否是第⼀次迭代,返回True或False |
loop.last | 是否是最后⼀次迭代,返回True或False |
loop.length | 序列的⻓度 |
另外,不可以使⽤continue和break表达式来控制循环的执⾏。
三、宏和import
- 宏的简介
宏类似常规编程语言中的函数。它们用于把常用行为作为可重用的函数,取代 手动重复的工作。如果宏在不同的模板中定义,你需要首先使用 import,比如:
{% macro input(name, value='', type='text', size=20) -%}
<input type="{{ type }}" name="{{ name }}" value="{{
value|e }}" size="{{ size }}">
{%- endmacro %}
在命名空间中,宏之后可以像函数一样调用:
<p>{{ input('username') }}</p>
<p>{{ input('password', type='password') }}</p>
- 宏的导入import
定义一个宏文件macros.html。
<!--宏模板文件-->
<!--macros.html-->
{% macro input(name="",value="", type="text") %}
<!--value加变量参数-->
<input type="{{type}}" name="{{ name }}" value="{{ value }}">
{% endmacro %}
导入方式有如下几种:
{% import "macros.html" as macros %}
{% from "macros.html" import input %}
{% from "macros.html" import input as macros %}
另外需要注意的是,导⼊模板并不会把当前上下⽂中的变量添加到被导⼊的模板中,如果你想要导⼊⼀个需要访问当前上下⽂变量的宏,有两种可能的⽅法显式地传⼊请求或请求对象的属性作为宏的参数与上下⽂⼀起(with context)导⼊宏。
{% import "macros.html" as macros with context %}