内容简介:需要对传入模板的变量做一些处理的时候,那么就可以用到过滤器。语法:简单的小例子,删除传入字符中的执行字符
flask -- jinja2模板之过滤器
需要对传入模板的变量做一些处理的时候,那么就可以用到过滤器。
语法: {{var | 过滤器名称}}
,使用管道符连接
常用过滤器
-
abs(value)
:返回一个数值的绝对值。例如:-1|abs
。 -
default(value,default_value)
:如果当前变量没有值,则会使用参数中的值来代替。name|default('hello world')
,如果name
不存在,则会使用hello world
来代替。boolean=False
默认是在只 有这个变量为undefined
的时候才会使用default中的值,即None
,[]
,{}
等都不会使用default
的默认值,当boolean=True
的时候就可以使用默认来代替,或者用name or 'hello world'
来代替name|default('hello world',boolean=True)
默认的boolean
是True
-
first(value)
:返回一个序列的第一个元素。name|first
-
format(value,*args,**kwargs)
:格式化字符串。 -
last(value)
:返回一个序列的最后一个元素。示例:names|last。
-
length(value)
:返回一个序列或者字典的长度。示例:names|length
-
join(value,d='u')
:将一个序列用d这个参数的值拼接成字符串 -
int(value)
:将值转换为int
类型 -
float(value)
:将值转换为float
类型 -
lower(value)
:将字符串转换为小写 -
upper(value)
:将字符串转换为大写 -
replace(value,old,new)
:替换将old
替换为new
的字符串 -
truncate(value,length=253,killwords=False)
:截取length长度的字符串 -
striptags(value)
:删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格 -
trim
:截取字符串前面和后面的空白字符 -
string(value)
:将变量转换成字符串 -
wordcount(s)
:计算一个长字符串中单词的个数
自动转义过滤器
-
escape(value)
或e:转义字符,会将等符号转义成HTML中的符号。例如content|escape
或content|e
,可以防御模板导致的xss攻击,但是不能防御属性注入xss
如果希望防御属性注入xss
那么必须确保属性中使用jinja表达式时,始终使用单引号或双引号包裹。如``具体可以参考jinja2的安全注意事项 -
safe(value)
:如果开启了全局转义,那么safe
过滤器会将变量关掉转义。示例:content_html|safe
-
autoescape
标签
{% autoescape off %} ........ {% endautoescape %}
一部分过滤器演示
# 省略初始化 @app.route(' @app.route('/') def hello_world(): context={ 'signature':'hello, world!', 'sigatureNone':None, 'script':'<script>alert("/xss/")</script>', 'hello':'hello world', 'article':'hello world hello world' } return render_template('index.html',**context)
<!-- 省略其他标签 --> <p>这里是default的册数: {{ signature|default('这个人很懒,没有留下任何说明') }}</p> <p>这里是Bool为False的测试:{{ sigatureNone|default('这个人很懒,没有留下任何说明') }}</p> <p>这里是Bool为True的测试:{{ sigatureNone|default('这个人很懒,没有留下任何说明',boolean=True) }}</p> <p>这里是Bool为True的测试:{{ sigatureNone or '这个人很懒,没有留下任何说明' }}</p> <p>这里是script测试:{{ script }}</p> <!-- 默认开启了自动转义--> {% autoescape off %} <!-- 使用这对标签,对标签内的内容关闭转义--> <p>这里是script测试:{{ script}}</p> {% endautoescape %} <p>这里是script|safe测试:{{ script|safe }}</p> <p>这里是replace测试:{{ hello|replace('world','<a href="https://www.miaoroom.com/tag/flask" data-toggle="tooltip" title="查看更多关于 flask 的文章" target="_blank">flask</a>') }}</p> <p>这里是truncate测试:{{ article|truncate(length=5) }}</p> <p>这是striptags测试:{{ script|striptags }}</p>
自定义过滤器
简单的小例子,删除传入字符中的执行字符
# 省略初始化 @app.template_filter('cut') #将定义的过滤器注册到jinja中 def cut(value): value = value.replace("hello","") return value @app.route('/') def hello_world(): context={ 'value':'hello world hello' } return render_template('index.html',**context)
<!-- 省略其他标签 --> <p>这是cut测试:{{ value|cut }}</p>
用自定义过滤器模拟时间显示
# 省略初始化 from datetime import datetime #导入模块 @app.route('/') def hello_world(): context={ 'time':datetime(2019,1,27,16,0,0) #设置一个时间做测试 } return render_template('index.html',**context) @app.template_filter('handle_time') def handle_time(time): """ time看距离现在的时间间隔 1.如果间隔时间小于1分钟,那么就显示"刚刚" 2.如果是一小时以内,那么就显示"xxx分钟前" 3.如果是24小事以内,那么就显示"xxx小时前" 4.如果是大于24小时,小于30天以内,那么就显示"xxx天前" 5.否则就显示具体时间 """ if isinstance(time,datetime): now = datetime.now() timestamp = (now-time).total_seconds() #total_seconds()是获取两个时间之间的总差。seconds()方法仅获取时间差的秒数,忽略天数 if timestamp < 60: return "刚刚" elif 60 * 60 > timestamp >= 60: minutes = timestamp / 60 return "%s分钟前" % int(minutes) elif 60 * 60 * 24 > timestamp > 60 * 60: hours = timestamp / (60 * 60) return "%s小时前" % int(hours) elif 60 * 60 * 24 * 30 > timestamp > 60 * 60 * 24: days = timestamp / (60 * 60 * 24) return "%s天前" % int(days) else: return time.strftime('%Y/%M/%d %H:%M')
<!-- 省略其他标签 --> <p>这是handle_time测试:{{ time|handle_time }}</p>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
jQuery基础教程
Jonathan Chaffer、Karl Swedberg / 李松峰、卢玉平 / 人民邮电出版社 / 2009-11 / 49.00元
《jQuery基础教程(第2版)》作为《jQuery基础教程》的升级版,涵盖了jQuery 1.3的全部新特性,特别是新增了介绍jQuery UI(jQuery官方用户界面插件库)的内容。《jQuery基础教程(第2版)》前6章以通俗易懂的方式介绍了jQuery的基本概念,主要包括jQuery的选择符、事件、效果、DOM操作、AJAX支持等。随后3章从理论到实践,通过表格操作、构建功能型表单、实现......一起来看看 《jQuery基础教程》 这本书的介绍吧!