模板过滤器
过滤器是通过管道符号(|)进行使用的。例如: {{ name|length }}, 将返回name的长度,过滤器相当于是一个函数,把当前的变量出入到过滤器中,然后过滤器根据自己的功能,再返回响应的值,之后再将结果渲染到页面中,Jinja2中内置了许多的过滤器,再这里可以看到所有的过滤器:
- abs(value): 返回一个数值的绝对值
- default(value,default_value,boolean=false):如果当前变量没有值,则会使用参"数中的值来代替。name|default(‘happy’)—如果name不存在,则会使用happy来替代。Boolean=False默认是在只有这个变量为undefined的时候才会使用default中的值,如果想使用python的形式判断是否为false,则可以传递Boolean=true。也可以使用or来替换。
- escape(value)或e:转义字符,会将<、>等符号转义成HTML中的符号。例如:content|escape或content|e。
- first(value):返回一个序列的第一个元素。name|first。
- format(value,*args,**kwags):格式化字符串。例如一下代码:
{{ “%s" - "%s"|format{"hello?","Fool") }}将输出:hello? - Fool
- last(value):返回一个序列的最后一个元素。例如:names|last。
- length(value):返回一个序列或者字典的长度。例如:names|length。
- join(value,d=u"):将一个序列用d这个参数的值拼接成字符串。
- safe(value):如果开启了全局转义,那么safe过滤器会将变量关掉转义。示例:content_heml|safe。
- int(value):将值转换为int类型
- float(value):将数值转化为float类型
- lower(value): 将字符串转化为小写
- uppwe(value): 将字符串转换为大写
- replace(value,old,new):替换将old替换为new的字符串
- truncate(value,length=255,killwords=False): 截取length长度的字符串
- stripags(value):删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格。
- trim:截取字符串前面和后面的空白字符
- string(value):将变量转换为字符串
- wordcount(s):计算一个长字符串中单词的个数(按照空格计算单词个数)
@app.route("/")
def index():
context = {
"username": "hello happy",
"age": -18,
"name": "haha" , # 可用Boolean类型来判断是否有值
"es": "<script>alert('xixihaha');</script>",
"books": ["Python","Java","PHP"]
}
return render_template("index.html", **context)
<!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>
<!-- 自动转义-->
<!-- <p>{{ es }}</p>-->
<!-- 关闭自动转义-->
<!-- {% autoescape off %}-->
<!-- <p>{{ es }}</p>-->
<!-- {% endautoescape %}-->
<!-- 标记这个字符串是安全的-->
<p>{{ es|safe }}</p>
<P>{{ books|first}}</P>
<P>{{ books|last}}</P>
<P>{{ books|length}}</P>
<P>{{ books|first|length}}</P>
<p> {{ username|replace("hello", "hi") }}</p>
<!-- 不会报错,但是没有显示,只有语法层面报错,才会在页面显示-->
<p>{{ abc|replace("hello", "hi") }}</p>
<!-- 用于文章标题,长度要大于等于3-->
<p>{{ username|truncate(length=5) }}</p>
<p>{{ es|striptags }}</p>
</body>
</html>
自定义过滤器
from flask import Flask, render_template
from datetime import datetime
@app.template_filter("handle_time")
def handle_time(time):
'''
小于1分钟 =》刚刚
大于1分钟小于1小时=》xx分钟之前
大于1小时小于24小时=》xxx小时之气那
: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
<p>文章发表的时间:{{ now_time|handle_time }}</p>
控制语句
所有的控制语句都是放在{%…%}中,并且有一个语句{% endxx %}来进行结束,Jinja中常用的控制语句有if/for…in…
if:i f语句和python中的类似,可以使用>,<,<=,>=,==,!=来进行判断,也可以通过and. or not, ()来进行逻辑合并操作
{% if kenny.sick %}
kenny is sick.
{% elif kenny.dead %}
you killed kenny! you bastard!!!
{% else %}
keeny looks okay ---so far
{% endif %}
for…in…:for循环可以遍历任何一个序列包括列表、字典、元组,并且可以进行方向遍历
遍历列表:
def index():
context = {
"username": "hi happy",
"books": ["python", "java","php"],
}
}
return render_template("if_for.html", **context)
{% for book in books %}
<p>{{ book }}</p>
{% endfor %}
遍历字典:
def index():
context = {
"username": "hi happy"
"users":{
"name": "xingyue",
"age": 18,
"addr": "henan"
}
}
return render_template("if_for.html", **context)
{% for key,value in users.items() %}
<p>{{ key}}</p>
<p>{{ value }}</p>
{% endfor %}
在Jinja中的for循环还包含一下变量,可以用来获取当前的遍历状态
loop.index: 当前迭代的索引(从1开始)
loop.index() : 当前迭代的索引(从0开始)
loop.first :是否是第一次迭代
loop.last:是否是最后一次迭代,返回true或false
loop.length: 序列的长度
另外,不可以使用continue和break表达式来控制循环的执行。