过滤器的使用
-
什么是过滤器
过滤器是通过 | 进行使用的,例如 {{ name|length }} 返回的就是name的长度,过滤器相当于一个函数,就是把当前的变量传入到
-
Jinja2模板内置的过滤器
- abs(value) : 返回一个数值的绝对值,例如{{ -1 | abs }} ,如果参数的数据类型不为数字时就会报错。
- default( value , default_value, doolean = False:如果当前变量没有值,则会用参数里面的值来代替。
{{ signature|default('此人很懒,什么都没有写。') }}
当我们的signature参数不存在时,即视图函数中没有传入参数的时候,就是使用default里面的默认值。 如果我们从视图函数中传入了signature这个值,但是它的值为'',[],None,{}这些值得时候,就不会使用default()里面的默认值了,因为我们是传入了signature这个变量的,只是值为空的而已,所以default()就不会使用我们传入的默认的值了。这个时候我们可以设置boolean=True,那么当我们传入'',[],None,{}这些值的时候,default()过滤器也回去使用我们传入的默认值了。
我们其实也可以用使用or来代替default()过滤器。’
{{ signature|default('此人很懒,什么都没有写。',boolean=True) }} *# 等价于下面的or语句* {{ signature or '此人很懒,什么都没有写' }}
- escape:转义字符,会将<、>等符号转义为html重的符号。让html把它当成一个普通的字符窜来进行解析,而不是当成html语言来解析。 例如当我们传入的signature参数为<script>alert("hello")</script>这样的一个字符窜的时候,我们肯定要对它进行转义,否则的话那别人能对我们的网站干的事情就很多了。 其实在flask中,默认是开启了自动转义的功能的,我们不使用escape过滤器也是可以的。
{{ signature|escape }}
- safe:告诉模板我们传入的参数是安全的,就不会自动去转义里面的特殊字符,html就会去解析里面的特殊字符。也就是和escape过滤器功能相反。 这个时候如果我们的signature的值为<script>alert("hello")</script>,那么这个里面的字符窜就会被解析了。
{{ signature|safe }}
- first(value): 返回序列的第一个元素
- last(value): 返回序列的最后一个元素
- int(value): 将值转换为int类型
- float(value): 将值转换为float类型
- string(value): 将变量转化为字符窜
- lower(value): 将字符窜转化为小写
- upper(value): 将字符窜转化为大写
- replace(value,old,new): 将字符窜中的old内容替换为new内容
- truncate(value,length=255,killwords=False,end=’…’): 截取length长度的字符窜
-
自定义过滤器
在flask里面,虽然拥有很多过滤器,当还是满足不了我们的需求,那么我们可以自定义过滤器
py文件:
# 自定义过滤器 def date_formate(value, format="%Y-%m-%d %H:%M"): return value.strftime(format) app.add_template_filter(date_formate,"dformat") @app.route('/filter') def filter(): user=User(username='zhiliao',email='3188206221@qq.com') mytime=datetime.now() return render_template("filter.html",user=user,mytime=mytime)
HTML文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>知了首页</title> </head> <body> <div>{{ user.username }} | {{ user.email }} | {{ user.username|length }}</div> <div>{{ mytime|dformat }}</div> </body> </html>
自定义过滤器的格式
@app.template_filter('过滤器的名称') #定义过滤器的名称 def handler_time(time): #过滤器的主体函数 """ 小于一分钟----->刚刚 大于一分钟小于一小时----->xxx分钟之前 大于一小时小于24小时------>xxx小时之前 """ now = datetime.now() #获取现在的时间戳 time_stamp = (now-time).total_seconds() #获取现在的时间距离我们定义的时间的总秒数 if isinstance(time,datetime): #如果time不是实例则输出else中的time if time_stamp < 60: return '刚刚' elif 60 <= time_stamp <= 60*60: return '%s分钟之前'% int(time_stamp/60) elif 60*60<=time_stamp <= 60*60*20: return '%s小时之前'%int(time_stamp/3600) else: return time
上面就是在flask自定义过滤器的写法,还是很简单的,我们只需要
app.template_filter
这个装饰器就可以了,然后里面传入我们过滤器的名字。当我们使用过滤器名称的时候,就会执行handler_time函数,然后将值传入handler_time函数中,所以我们的过滤器函数必须至少有一个参数。