1、 过滤器的介绍和语法
* 介绍:过滤器可以处理变量,把原始的变量经过处理后在展示出来。作用的对象是变量。
* 语法:{{ avatar | default('xxx') }}
1.1 default()过滤器
<body>
<p>过滤器模板文件</p>
<img src="{{ img_url | default('http://img3.imgtn.bdimg.com/it/u=4925141,1914114694&fm=26&gp=0.jpg') }}">
</body>
@app.route('/')
def index():
img_url = 'http://img2.ali213.net/picfile/News/2015/08/25/584_20150825114351713.jpg'
return render_template('index.html', img_url = img_url) # 后端不上传图片,前端将加载默认的图片
在本例的作用,若前台没接收到变量img_url,即render_template()没有传递该参数,则src赋值为default()里面的值。
注意:(1){{ par | default(string, boolean=False) }}有两个参数,第二个参数默认是False,即判断该变量par是否存在,存在则直接显示par的值,不存在则由string替换。当参数2的boolean=True时,则不仅要判断该变量par是否存在,还要判断该变量是否是None或空值(空列表、空字典、空字符串)。
(2)当boolean=True时,则{{ par | default(string, boolean=False) }}等价于{{ par or string }}
1.2 length过滤器
获取列表、字符串、字典、元组等长度。例如用来显示文字评论的总数。
<body>
<p>评论数:({{ comments|length }})</p>
<ul>
{% for comment in comments %}
<li>
<a href="#">{{ comment.user }}</a>
<p href="#">{{ comment.content }}</p>
</li>
{% endfor %}
</ul>
</body>
@app.route('/')
def index():
# 定义一个评论列表
comments = [
{
'user' : '张三',
'content' : 'ZS觉得不错哦'
},
{
'user' : '李四',
'content' : 'LS觉得一般般吧'
},
{
'user' : '王五',
'content' : 'WW认为质量很差'
}
]
return render_template('index.html',comments=comments)
效果如下:
1.3 其他常见过滤器
-
abs(value):返回一个数值的绝对值。示例:-1|abs
-
default(value,default_value,boolean=false):如果当前变量没有值,则会使用参数中的值来代替。示例:name|default(‘xiaotuo’)——如果name不存在,则会使用xiaotuo来替代。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):格式化字符串。比如:{{ "%s - %s"|format('Hello',"Python") }},将输出:Hello - Python
-
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):计算一个长字符串中单词的个数。
2、自定义过滤器
以自定义编译markdown文件的过滤器为例。本例提供了两种方式分别是编译传过来的字符串变量和调用方法将读取的文件内容编译为HTML内容。
其中若想在前台模板文件中调用后台定义的方法函数,要用到@app.context_processor装饰器,将定义的方法函数注册到模板中,让前台模板调用后台定义的方法函数
注:用template_filter()装饰器自定义过滤器,
* 首先在项目文件里新建一个markdown文件,这里 命名为:markdown_content.md,里面写的内容是用markdown语法写的,如下:
# 欢迎使用Markdown编辑器
## 如何改变文本的样式
*强调文本* _强调文本_
**加粗文本** __加粗文本__
* 后台.py文件和前台index.html文件中代码如下:
from flask import Flask, render_template
from functools import reduce
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html',
title='<h1>Hello Python</h1>',
md_content='## Header2'
)
@app.template_filter('md')
def markdown_to_html(txt):
from markdown import markdown
return markdown(txt)
def read_md(filename):
with open(filename,encoding='UTF-8') as md_file:
content = reduce(lambda x, y: x + y, md_file.readlines())
return content
# return content.decode('UTF-8')
# 该装饰器是将定义方法函数注册到模板中,让前台模板调用后台这些定义的方法函数
@app.context_processor
def inject_methods():
return dict(read_md=read_md) # 返回一个字典,将上面定义的read_md函数作为字典的元素参数
if __name__ == '__main__':
app.run(debug=True)
<body>
{{ title|safe }}
{{ md_content|md|safe }}
{{ read_md('markdown_content.md')|md|safe }}
</body>
效果如下:
注意:
@app.context_processor该装饰器是将定义的方法函数注册到模板中,让前台模板调用后台定义的方法函数
以上笔记来源于知了课堂黄勇老师讲解的教学视频《Flask框架入门到实战开发》的第二章第5小节的学习笔记,不足之处不吝赐教!