1.模板过滤器
模板过滤器是在html模板中对渲染数据进行处理的一种方法,过滤器是通过管道符号(|)进行使用的,例如:{ { name|length }},将返回name的长度。过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功能,再返回相应的值,之后再将结果渲染到页面中。
例如,我们新建一个app.py实例文件,
from flask import Flask, render_template
app = Flask(__name__)
app.config.update({
'DEBUG': True,
'TEMPLATES_AUTO_RELOAD': True
})
# 修改配置文件,开启DEBUG模式和自动重新加载
@app.route('/')
def age_filter():
content = {
'name': 'zhangsan',
'age': '18'
}
return render_template('filter.html', **content)
if __name__ == '__main__':
app.run()
再新建一个filter.html文件,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>过滤器</title>
</head>
<body>
{
% if age | int >= 18 %} // 将age变量的值转换为int类型
<h3>{
{
name | upper }}是成年人</h3> // 将name属性值大写
{
% else %}
<h3>{
{
name | upper }}是未成年人</h3>
{
% endif %}
</body>
</html>
这样,页面中的name会大写显示。
以下是一些常用的模板过滤器,
名称 | 作用 |
---|---|
abs(value) | 返回一个数值的绝对值 |
default(value,default_value,boolean=false) | 如果当前变量没有值,则会使用参数中的值来代替 |
escape(value)或e | 转义字符,会将<、>等符号转义成HTML中的符号 |
first(value) | 返回一个序列的第一个元素 |
format(value,*arags,**kwargs) | 格式化字符串 |
last(value) | 返回一个序列的最后一个元素 |
length(value) | 返回一个序列或者字典的长度 |
join(value,d=u’’) | 将一个序列用d这个参数的值拼接成字符串 |
safe(value) | 如果开启了全局转义,那么safe过滤器会将变量关掉转义 |
int(value) | 将值转换为int类型 |
float(value) | 将值转换为float类型 |
lower(value) | 将字符串转换为小写 |
upper(value) | 将字符串转换为大写 |
replace(value,old,new) | 替换将old替换为new的字符串 |
truncate(value,length=255,killwords=False) | 截取length长度的字符串 |
striptags(value) | 删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格 |
trim | 截取字符串前面和后面的空白字符 |
string(value) | 将变量转换成字符串 |
wordcount(s) | 计算一个长字符串中单词的个数 |
这里我们介绍一下,safe过滤器。
我们有时需要接收从服务器上传来的代码并运行,由于flask框架中为了防止xss攻击等恶意行为,默认自动开启了全局转义,也就是把一些特殊字符串转义为安全的字符串,这样,就可以避免一些攻击,但是,我们从主服务器上传来的代码也同样被转义了,因此,我们可以使用safe过滤器来取消局部转义。
例如,新建一个app.py实例文件,
from flask import Flask, render_template
app = Flask(__name__)
app.config.update({
'DEBUG': True,
'TEMPLATES_AUTO_RELOAD': True
})
@app.route('/safe/')
def server_code():
content = {
'code': '<script>alert("服务器代码")</script>'
} # code为服务器传递的代码,该代码需要在html页面中运行
return render_template('safe.html', **content)
if __name__ == '__main__':
app.run()
safe.html代码如下,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>safe</title>
</head>
<body>
{
{
code | safe }} // 将code内容取消转义
</body>
</html>
上面是一种取消转义的方法,下面的代码同样可以起到相同的作用,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>safe</title>
</head>
<body>
{
% autoescape false %} // 取消自动转义
{
{
code }}
{
% endautoescape %}
</body>
</html>
2.自定义模板过滤器
由于需求的不同,模板过滤器可能无法满足我们的使用,这是我们需要自定义模板过滤器来实现需求。
自定义的模板过滤器实质上是一个函数,该函数最多只能有两个参数。自定义模板过滤器需要在模板中进行加载方可使用。
例如,我们想要实现一个查看指定日期距离当前时间的时间间隔的功能,如果时间间隔小于1分钟,则显示刚刚;时间间隔大于1分钟小于1小时,则显示几分钟前;时间间隔大于1小时小于24小时,则显示几小时前;时间间隔大于24小时小于30天,则显示几天前;时间间隔超过30天,显示年月日时分秒。
我们首先新建一个app.py实例文件,代码如下,
from flask import Flask, render_template
from datetime import datetime
app = Flask(__name__)
app.config.update({
'DEBUG': True,
'TEMPLATES_AUTO_RELOAD': True
})
@app.route('/time/')
def show_time():
content = {
'time': datetime(2020, 4, 12, 13, 0, 0)
}
return render_template('timeframe.html', **content)
@app.temp