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>