Flask-Jinja2模版过滤器

Jinja2模版过滤器

过滤器是通过管道符号(|)进行使用的,例如:{{ name|length }},将返回name的长度。过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功能,再返回相应的值,之后再将结果渲染到页面中。Jinja2中内置了许多过滤器,在这里可以看到所有的过滤器
• abs(value):返回一个数值的绝对值。
• default(value,default_value,boolean=false):如果当前变量没有值,则会使用参数中的值来代替。name|default(‘juran’)——如果name不存在,则会使用juran来替代。boolean=False默认是在只有这个变量为undefined的时候才会使用default中的值,如果想使用python的形式判断是否为false,则可以传递boolean=true。也可以使用or来替换。
• escape(value)或e:转义字符,会将<、>等符号转义成HTML中的符号。例如:content|escape或content|e。
• first(value):返回一个序列的第一个元素。names|first。
• format(value,*arags,**kwargs):格式化字符串。例如以下代码:
last(value):返回一个序列的最后一个元素。示例:names|last。
length(value):返回一个序列或者字典的长度。示例:names|length。
join(value,d=u’’):将一个序列用d这个参数的值拼接成字符串。
safe(value):如果开启了全局转义,那么safe过滤器会将变量关掉转义。示例:content_html|safe。
int(value):将值转换为int类型。
float(value):将值转换为float类型。
lower(value):将字符串转换为小写。
upper(value):将字符串转换为小写。
replace(value,old,new): 替换将old替换为new的字符串。
truncate(value,length=255,killwords=False):截取length长度的字符串。
striptags(value):删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格。
trim:截取字符串前面和后面的空白字符。
string(value):将变量转换成字符串。
wordcount(s):计算一个长字符串中单词的个数。

Flask模版内置过虑器:

# @ Time : 2020/4/11 15:48
# @ Author : Ellen

from flask import Flask,render_template
from datetime import datetime

app = Flask(__name__)
# 模版文件自动更新
app.config['TEMPLATES_AUTO_RELOAD'] = True


@app.route("/")
def index():
    context = {
        "username": "hello Ellen",
        "age": -18,
        "es": "<script>alert('hello');</script>",
        "h1": "<h1>hello</h1>",
        "books": ["Python","Java","PHP"],
        "address": "上海市闵行区"

    }
    return render_template("index.html",**context)

# 自定义模版过虑器
@app.template_filter("my_cut")
def cut(value):
    return value.replace("hello","")

自定义模版过虑器
@app.template_filter("handle_time")
def handle_time(time):
    """
    小于1分种:显示刚刚
    大于1分种小于1小时:显示多少分钟之前
    大于1小时小于24小时:显示xx小时之前
    :param time:
    :return:
    """
    if isinstance(time, datetime):
        now = datetime.now()
        # total_seconds 得到总秒数
        timestamp = (now - time).total_seconds()
        if timestamp < 60:
            return "刚刚"
        elif timestamp >=60 and timestamp <= 60*60:
            return "%s分钟之前" % int(timestamp/60)
        elif timestamp >= 60*60 and timestamp <= 60*60*24:
            return "%s小时之前" % int(timestamp/(60*60))
    else:
        return time


if __name__ == '__main__':
    app.run(debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>这是首页</h1>
    <p>{{ username }}</p>
    <p>{{ age|abs }}</p>
    <p>{{ name|default("这个人很懒,没有留下任何签名") }}</p>
    <!--自动转义-->
    {% autoescape off %}
    <p>{{ es }}</p>
    {% endautoescape %}
    <!--标记这个字符是安全的-->
    <p>{{es|safe}}</p>
    <p>{{h1|safe}}</p>
    <P>{{books|first}}</P>
    <P>{{books|last}}</P>
    <P>{{books|length}}</P>
    <P>{{books|first|length}}</P>
    <p>{{ username|upper }}</p>
    <p>{{ username|replace("hello","Hello") }}</p>
    <!-- 不会报错 但是没有显示 只有语法层面报错 才会显示   -->
    <p>{{ abc|replace("hello","Hello") }}</p>
    <!--  文章标题经常用到 -->
    <p>{{ username|truncate(length=5) }}</p>
    <p>{{ es|striptags() }}</p>
    <p>{{ username|trim }}</p>
    <p>{{ address|wordcount }}</p>
    <p>{{ username|my_cut }}</p>
	<p>文章发表时间:{{ now_time|handle_time}}</p>
</body>
</html>

在这里插入图片描述

发布了118 篇原创文章 · 获赞 0 · 访问量 2664

猜你喜欢

转载自blog.csdn.net/weixin_45905671/article/details/105453606