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

栏目: Python · 发布时间: 5年前

内容简介:需要对传入模板的变量做一些处理的时候,那么就可以用到过滤器。语法:简单的小例子,删除传入字符中的执行字符

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 标签
{% 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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法时代

算法时代

Luke Dormehl / 胡小锐、钟毅 / 中信出版集团 / 2016-4-1 / CNY 59.00

世界上的一切事物都可以被简化成一个公式吗?数字可以告诉我们谁是适合我们的另一半,而且能和我们白头偕老吗?算法可以准确预测电影的票房收入,并且让电影更卖座吗?程序软件能预知谁将要实施犯罪,并且精确到案发时间吗?这些事听起来都像是科幻小说中的情节,但事实上,它们仅是日益被算法主宰的人类世界的“冰山一角”。 近年来随着大数据技术的快速发展,我们正在进入“算法经济时代”。每天,算法都会对展示在我们眼......一起来看看 《算法时代》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

随机密码生成器
随机密码生成器

多种字符组合密码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试