「Flask笔记」 jinja2模板之过滤器

「Flask笔记」 jinja2模板之过滤器

资源介绍参数
资源类别: Python
如遇问题: 联系客服/留言反馈
「Flask笔记」 jinja2模板之过滤器。flask – jinja2模板之过滤器需要对传入模板的变量做一些处理的时候,那么就可以用到过滤器。语法:{{var | 过滤器名称}},使用管道符连接常用过滤器abs(value):返回一个数值的绝对值。例如:-1|abs。

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)默认的booleanTrue
  • 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|escapecontent|e,可以防御模板导致的xss攻击,但是不能防御属性注入xss如果希望防御属性注入xss那么必须确保属性中使用jinja表达式时,始终使用单引号或双引号包裹。如“具体可以参考jinja2的安全注意事项
  • safe(value):如果开启了全局转义,那么safe过滤器会将变量关掉转义。示例:content_html|safe
  • autoescape标签
  1. {% autoescape off %}
  2. ........
  3. {% endautoescape %}

一部分过滤器演示

  1. # 省略初始化
  2. @app.route('
  3. @app.route('/')
  4. def hello_world():
  5. context={
  6. 'signature':'hello, world!',
  7. 'sigatureNone':None,
  8. 'script':'<script>alert("/xss/")</script>',
  9. 'hello':'hello world',
  10. 'article':'hello world hello world'
  11. }
  12. return render_template('index.html',**context)
  1. <!-- 省略其他标签 -->
  2. <p>这里是default的册数: {{ signature|default('这个人很懒,没有留下任何说明') }}</p>
  3. <p>这里是Bool为False的测试:{{ sigatureNone|default('这个人很懒,没有留下任何说明') }}</p>
  4. <p>这里是Bool为True的测试:{{ sigatureNone|default('这个人很懒,没有留下任何说明',boolean=True) }}</p>
  5. <p>这里是Bool为True的测试:{{ sigatureNone or '这个人很懒,没有留下任何说明' }}</p>
  6. <p>这里是script测试:{{ script }}</p> <!-- 默认开启了自动转义-->
  7. {% autoescape off %} <!-- 使用这对标签,对标签内的内容关闭转义-->
  8. <p>这里是script测试:{{ script}}</p>
  9. {% endautoescape %}
  10. <p>这里是script|safe测试:{{ script|safe }}</p>
  11. <p>这里是replace测试:{{ hello|replace('world','flask') }}</p>
  12. <p>这里是truncate测试:{{ article|truncate(length=5) }}</p>
  13. <p>这是striptags测试:{{ script|striptags }}</p>

自定义过滤器

简单的小例子,删除传入字符中的执行字符

  1. # 省略初始化
  2. @app.template_filter('cut') #将定义的过滤器注册到jinja中
  3. def cut(value):
  4. value = value.replace("hello","")
  5. return value
  6. @app.route('/')
  7. def hello_world():
  8. context={
  9. 'value':'hello world hello'
  10. }
  11. return render_template('index.html',**context)
  1. <!-- 省略其他标签 -->
  2. <p>这是cut测试:{{ value|cut }}</p>

用自定义过滤器模拟时间显示

  1. # 省略初始化
  2. from datetime import datetime #导入模块
  3. @app.route('/')
  4. def hello_world():
  5. context={
  6. 'time':datetime(2019,1,27,16,0,0) #设置一个时间做测试
  7. }
  8. return render_template('index.html',**context)
  9. @app.template_filter('handle_time')
  10. def handle_time(time):
  11. """
  12. time看距离现在的时间间隔
  13. 1.如果间隔时间小于1分钟,那么就显示"刚刚"
  14. 2.如果是一小时以内,那么就显示"xxx分钟前"
  15. 3.如果是24小事以内,那么就显示"xxx小时前"
  16. 4.如果是大于24小时,小于30天以内,那么就显示"xxx天前"
  17. 5.否则就显示具体时间
  18. """
  19. if isinstance(time,datetime):
  20. now = datetime.now()
  21. timestamp = (now-time).total_seconds()
  22. #total_seconds()是获取两个时间之间的总差。seconds()方法仅获取时间差的秒数,忽略天数
  23. if timestamp < 60:
  24. return "刚刚"
  25. elif 60 * 60 > timestamp >= 60:
  26. minutes = timestamp / 60
  27. return "%s分钟前" % int(minutes)
  28. elif 60 * 60 * 24 > timestamp > 60 * 60:
  29. hours = timestamp / (60 * 60)
  30. return "%s小时前" % int(hours)
  31. elif 60 * 60 * 24 * 30 > timestamp > 60 * 60 * 24:
  32. days = timestamp / (60 * 60 * 24)
  33. return "%s天前" % int(days)
  34. else:
  35. return time.strftime('%Y/%M/%d %H:%M')
  1. <!-- 省略其他标签 -->
  2. <p>这是handle_time测试:{{ time|handle_time }}</p>
声明:本文为原创作品,版权归作者所有。未经许可,不得转载或用于任何商业用途。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
0 条回复 A文章作者 M管理员
欢迎您,新朋友,感谢参与互动!
    暂无讨论,说说你的看法吧