9. flask过滤器filter

过滤器

什么是过滤器,语法是什么:

  1. 有时候我们想要在模版中对一些变量进行处理,那么就必须需要类似于Python中的函数一样,可以将这个值传到函数中,然后做一些操作。在模版中,过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功能,再返回相应的值,之后再将结果渲染到页面中。
  2. 基本语法:{{ variable|过滤器名字 }}。使用管道符号|进行组合。

常用过滤器:

default过滤器:

使用方式{{ value|default('默认值') }}。如果value这个key不存在,那么就会使用default过滤器提供的默认值。如果你想使用类似于python中判断一个值是否为False(例如:None、空字符串、空列表、空字典等),那么就必须要传递另外一个参数{{ value|default('默认值',boolean=True) }}
可以使用or来替代default('默认值',boolean=True)。例如:{{ signature or '此人很懒,没有留下任何说明' }}

自动转义过滤器:
  1. safe过滤器:可以关闭一个字符串的自动转义。
  2. escape过滤器:对某一个字符串进行转义,转换为可执行的形式,比如让<转为&lt;
  3. autoescape标签,可以对他里面的代码块关闭或开启自动转义,off的时候为能执行的格式,on开启转义。
    {% autoescape off/on %}
        ...代码块
    {% endautoescape %}
    

常用过滤器:

  1. first(value):返回一个序列的第一个元素。names|first。
    format(value,*arags,**kwargs):格式化字符串。例如以下代码:
    {{ "%s" - "%s"|format('Hello?',"Foo!") }}
    

将输出:Helloo? - Foo!

  1. last(value):返回一个序列的最后一个元素。示例:names|last。

  2. length(value):返回一个序列或者字典的长度。示例:names|length。

  3. join(value,d=u’’):将一个序列用d这个参数的值拼接成字符串。

  4. safe(value):如果开启了全局转义,那么safe过滤器会将变量关掉转义。示例:content_html|safe。

  5. int(value):将值转换为int类型。

  6. float(value):将值转换为float类型。

  7. lower(value):将字符串转换为小写。

  8. upper(value):将字符串转换为小写。

  9. replace(value,old,new): 替换将old替换为new的字符串。

  10. truncate(value,length=255,killwords=False):截取length长度的字符串。

  11. striptags(value):删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格。

  12. trim:截取字符串前面和后面的空白字符。

  13. string(value):将变量转换成字符串。

  14. wordcount(s):计算一个长字符串中单词的个数。

自定义模版过滤器:

过滤器本质上就是一个函数。如果在模版中调用这个过滤器,那么就会将这个变量的值作为第一个参数传给过滤器这个函数,然后函数的返回值会作为这个过滤器的返回值。需要使用到一个装饰器:@app.template_filter('cut')

@app.template_filter('cut')
def cut(value):
    value = value.replace("hello",'')
    return value
<p>{{ article|cut }}</p>

demo

  • demo.py
from flask import Flask, render_template
from datetime import datetime

app = Flask(__name__)
app.config['TEMPLATES_AUTO_RELOAD'] = True


@app.route('/')
def index():
    context = {
        'position': -9,
        'signature': '<script>alert("hello")</script>',
        'persons': ['cui', 'kaiyuan'],
        'age': "18",
        'article': 'hello world hello',
        'create_time': datetime(2020, 2, 10, 16, 19, 0)
    }
    return render_template('index.html', **context)


@app.template_filter('cut')
def cut(value):
    value = value.replace("hello",'')
    return value


@app.template_filter('handle_time')
def handle_time(time):
    """
    time距离现在的时间间隔
    1. 如果时间间隔小于1分钟以内,那么就显示“刚刚”
    2. 如果是大于1分钟小于1小时,那么就显示“xx分钟前”
    3. 如果是大于1小时小于24小时,那么就显示“xx小时前”
    4. 如果是大于24小时小于30天以内,那么就显示“xx天前”
    5. 否则就是显示具体的时间 2017/10/20 16:15
    """
    if isinstance(time, datetime):
        now = datetime.now()
        timestamp = (now - time).total_seconds()
        if timestamp < 60:
            return "刚刚"
        elif timestamp >= 60 and timestamp < 60 * 60:
            minutes = timestamp / 60
            return "%s分钟前" % int(minutes)
        elif timestamp >= 60 * 60 and timestamp < 60 * 60 * 24:
            hours = timestamp / (60 * 60)
            return '%s小时前' % int(hours)
        elif timestamp >= 60*60*24 and timestamp < 60*60*24*30:
            days = timestamp / (60*60*24)
            return "%s天前" % int(days)
        else:
            return time.strftime('%Y/%m/%d %H:%M')
    else:
        return time


if __name__ == '__main__':
    app.run(debug=True)

  • index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>主页</title>
</head>
<body>
{#    <p>位置的绝对值是:{{ position|abs }}</p>#}
<!-- 若存在且为空(None or False)还想使用default,则在default函数最后添加参数boolean=True 或者使用or -->
{#    <p>个性签名:{{ signature or '此人很懒,没有留下任何说明' }}</p>#}
{#    <p>个性签名:{{ signature | default('此人很懒,没有留下任何说明')  }}</p>  #}
{#        <p>个性签名:{{ signature|safe }}</p>#}
{#    {% autoescape off %}#}
{#    {% endautoescape %}#}
{#    <p>{{ persons[0] }}</p>#}
{#    <p>{{ "我的名字是:%s"|format('cui') }}</p>#}
{#    <p>人数{{ persons|length }}</p>#}
{#    {% if age|int == 18 %}#}
{#        <p>年龄是18岁</p>#}
{#    {% else %}#}
{#        <p>年龄不是18岁</p>#}
{#    {% endif %}#}
{#    <p>{{ article|replace('hello','aaa') }}</p>#}
{#    <p>{{ article|truncate(length=5) }}</p>#}
{#    <p>{{ signature|striptags }}</p>#}
{#    <p>{{ article|cut }}</p>#}
    <p>发表时间:{{ create_time|handle_time }}</p>
</body>
</html>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值