Flask学习笔记之:jinja2变量过滤器以及自定义过滤器
何为变量过滤器
网上解释:
Django和Flask框架中都使用了jinja2模板引擎来渲染模板,通过后端向模板中传递变量,通过过滤器可以修改这些变量,过滤器添加在变量名之后,中间使用竖线分割。
我的理解:
变量过滤器其实就是执行一个函数,把变量传入函数,把函数的返回值填充到这个位置。
变量过滤器的使用方式
(注意,既然我把变量过滤器看作一个函数,这里我对参数个数的解释就与网上的有些出入,这样解释是为了方便我们自己写过滤器,不要揪着到底算是没有参数还是有一个参数不放,明白我的意思就好了)
使用方式为:变量名 | 过滤器。
{{variable | filter_name(*args)}}
这个variable实际上作为 filter_name函数的第一个参数传入,第二和其它参数从*args中传入。
如果只有一个参数传给过滤器,则可以把括号省略掉
{{variable | filter_name}}
jinja2内置的变量过滤器
常见内建过滤器:
例子:
小写转为大写
<p>{{ 'hello' | upper }}</p>
字符串操作:
safe:禁用转义
capitalize:把变量值的首字母转成大写,其余字母转小写
lower:把值转成小写
upper:把值转成大写
title:把值中的每个单词的首字母都转成大写
reverse:字符串反转
format:格式化输出
striptags:渲染之前把值中所有的HTML标签都删掉
truncate: 字符串截断
列表操作:
first:取第一个元素
last:取最后一个元素
length:获取列表长度
sum:列表求和
sort:列表排序
整块操作
{% filter upper %}
balabala
balabala
{% endfilter %}
支持链式调用
在 jinja2 中,过滤器是可以支持链式调用的,示例如下:
{{ "hey, man!" | reverse | upper }}
自定义变量过滤器
尽管jinja2提供了丰富的内置过滤器,但是有些时候还是没办法满足我们的需求。
好在jinja2支持自定义过滤器,我们来写一个:
后端:
def stamp2time(stamp):
sec_count=int(time.time()-float(stamp))
if(sec_count<=25):
return "在线"+"("+ str(sec_count) +"秒前更新)"
elif(stamp!="0"):
minite_count=int(sec_count/60)
hour_count=int((sec_count/3600)%24)
day_count=int((sec_count/3600)/24)
tmp_str=' '
if(day_count>0):
tmp_str=str(day_count)+"天"
elif(hour_count>0):
tmp_str=str(hour_count)+"小时"
elif(minite_count>0):
tmp_str=str(minite_count)+"分钟"
else:
tmp_str=str(sec_count)+"秒"
return "离线"+"("+tmp_str+"前更新)"
else:
return "从未上线"
#下面两行不要忘记加入!
env = app.jinja_env#取得运行环境
env.filters['stamp2time'] = stamp2time#注册自定义过滤器
前端:
<td>{{u.time|stamp2time}}</td>
其中:u.time传入了数据库中存储的最近一次更新时间的时间戳,经过stamp2time转化后变成了我们需要的文本。
可以看到,过滤器其实就是一个函数,自带的过滤器的函数已经帮我们写好了,自定义变量过滤器的函数我们自己写就好了,就这么简单!
————————————————————————————————————————
END
欢迎大家关注,点赞,收藏哦,您的支持是我加速更新和为您写出更好文章的动力!