jinja2 模板过滤器
在此前 Flask 与 Html 代码结合中,数据的渲染过程就是简单的传参,jinja2 过滤器的作用是将参数的传递不一般化,也就是说将数据渲染之前先做某些处理
Html 文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>jinja2 过滤器</h1>
<!-- 直接渲染 name 数据 -->
<p>{{name}}</p>
<!-- 将 name 数据的字符串 su 替换为 ke -->
<p>{{name|replace('su', 'ke') }}</p>
<!-- 将 age 数据取绝对值 并显示出来 -->
<p>{{age|abs}}</p>
<!-- 如果 home 取不到数据 那么默认显示为 这家伙很懒,什么都没有留下 -->
<p>{{home|default('这家伙很懒,什么都没有留下')}}</p>
<!-- 分析数据 home 并分出由几个词组成 并显示出来-->
<p>{{home|wordcount}}</p>
<!-- 将 html 标签以原意显示出来 -->
<p>{{p|safe}}</p>
<!-- 将数据列表 book 第一项显示出来-->
<p>{{book|first}}</p>
<!-- 将数据列表 book 最后一项显示出来-->
<p>{{book|last}}</p>
<!-- 将数据 book 的长度显示出来-->
<p>{{book|length}}</p>
</body>
</html>
Python 文件
from flask import Flask, render_template
# Flask 模块的作用是创建实例 render_template 的作用是引入外部 Html 文件
web = Flask(__name__) # 创建 Flask 实例
@web.route('/') # 关联视图函数
def index(): # 视图函数
context = { # 字典文本
'name': 'xiao su', # 字符串
'age': -19, # 整型
'home': '湖北 荆州', # 字符串
'p': "<p>我是 p 标签</p>", # 字符串
'book': ['python', 'java', 'php'], # 列表
}
return render_template('day_3.html', **context) # 连接 Html 文件
if __name__ == '__main__':
web.run(debug=True)
渲染效果
自定义过滤器
Html 文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>{{name|my_filter}}</p>
</body>
</html>
Python 文件
from flask import Flask, render_template
# Flask 模块的作用是创建实例 render_template 的作用是引入外部 Html 文件
web = Flask(__name__) # 创建 Flask 实例
@web.route("/")
def hello_flask():
return render_template('day_3.html', name="hello su")
# 自定义过滤器
@web.template_filter('my_filter')
def my_filter(value):
return value.replace('su', 'ke')
if __name__ == '__main__':
web.run(debug=True)
关联视图函数的方法
语法:对象.add_url_rule('url', view_func=视图函数名, endpoint='别名')
from flask import Flask, url_for
web = Flask(__name__)
# 注意此处并没有关联视图函数
# @web.route('/web/')
def hello_flask():
print(url_for('hello'))
return 'hello su'
web.add_url_rule('/web/', view_func=hello_flask, endpoint='hello')
if __name__ == '__main__':
web.run(debug=True)
执行的结果是,浏览器中显示 hello su,Pycharm 中显示 /web/
标准视图类
from flask import Flask, url_for, views, jsonify
web = Flask(__name__)
# 视图类继承于类 views.View
class ListView(views.View):
# 此方法需要重写 不然就会报错
def dispatch_request(self):
return '类视图'
class JsonView(views.View):
def get_response(self):
raise NotImplementedError()
def dispatch_request(self):
response = self.get_response()
return jsonify(response)
class ListJsonView(JsonView):
def get_response(self):
return {'name': 'cheney'}
# 给视图类增添 url 属性
web.add_url_rule('/list/', view_func=ListView.as_view('list'))
web.add_url_rule('/json/', view_func=JsonView.as_view('json'))
web.add_url_rule('/jsonlist/', view_func=ListJsonView.as_view('jsonlist'))
if __name__ == '__main__':
web.run(debug=True, port=8000)
渲染效果
标准视图类的使用
Python 文件
from flask import Flask, views, render_template
web = Flask(__name__)
class BaseView(views.View): # 基类 继承于 views.View
def __init__(self): # 定义一个字典文本 username su
self.context = {
'username': 'su'
}
class FirstView(BaseView): # 创建一个类 使之继承于基类
def dispatch_request(self):
return render_template('first.html', **self.context)
class SecondView(BaseView): # 创建一个类 使之继承于基类
def dispatch_request(self):
return render_template('second.html', **self.context)
# 给视图类增添 url 属性
web.add_url_rule('/first/', view_func=FirstView.as_view('first'))
web.add_url_rule('/second/', view_func=SecondView.as_view('second'))
if __name__ == '__main__':
web.run(debug=True, port=8000)
Html 文件 first.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>登录页面</h1>
<p>{{username}}</p>
</body>
</html>
Html 文件 second.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>注册页面</h1>
<p>{{username}}</p>
</body>
</html>
渲染效果 由类视图 FirstView 渲染
渲染效果 由类视图 SecondView 渲染