目录
复习装饰器基础及其应用,可参考文章:闭包和装饰器
7.内置装饰器(钩子函数)
7.1 before_request
before_request用于请求前验证
如果before_request里的其中一个函数有返回值,则直接跳到after_request的列表里从后往前验证。
# before_request 和 after_request
from flask import Flask
app = Flask(__name__)
@app.before_request
def xxx1():
print('前1')
@app.before_request
def xxx2():
print('前2')
@app.route('/x1', methods=['GET', 'POST'])
def X1():
print('视图函数x1')
return '视图函数x1'
if __name__ == '__main__':
app.run()
例子:使用before_request做登录验证
from flask import Flask, request, session, redirect
app = Flask(__name__)
app.secret_key = "sasfangndga"
@app.before_request
def check_login():
if request.path == '/login':
return None
user = session.get('user_info')
if not user:
return redirect('/login')
@app.route('/login', methods=['GET', 'POST'])
def login():
return '视图函数x1'
@app.route('/index', methods=['GET', 'POST'])
def X2():
print('视图函数x2')
return '视图函数x2'
if __name__ == '__main__':
app.run()
7.2 after_request
after_request用于请求后验证
after_request效果和django 的process_response是一样的,必须有返回值,没有则报错。
# before_request 和 after_request
from flask import Flask
app = Flask(__name__)
@app.before_request
def xxx1():
print('前1')
@app.before_request
def xxx2():
print('前2')
@app.after_request
def yyy1(response):
print('后1')
return response
@app.after_request
def yyy2(response):
print('后2')
return response
@app.route('/x1', methods=['GET', 'POST'])
def X1():
print('视图函数x1')
return '视图函数x1'
@app.route('/x2', methods=['GET', 'POST'])
def X2():
print('视图函数x2')
return '视图函数x2'
if __name__ == '__main__':
app.run()
# 执行顺序如下
# 前1
# 前2
# 视图函数x2
# 后2
# 后1
flask中间件装饰器执行顺序: 如果多个app.before_request和app.after_request, app.before_request是按照从上而下执行(文件的上下),app.after_request是自下而上执行。
7.3 before_first_request
第一次来请求操作的装饰器:
@app.before_first_request
def first(*args,**kwargs):
pass
'''
只有第一次请求时候才执行的函数装饰器
'''
7.4 error_handlers
@app.error_handlers(404)
def error_404(arg):
'''自定义错误页面,根据状态码定制'''
return "404错误啦"
7.5 template_filter
app.template_filter(‘过滤器名字’)。
flask 中用@app.template_filter(‘name’)来自定义名字为name的过滤器,name可以不指定,当不指定的时候使用函数的名称。
@app.template_filter()
def db(a1,a2,a3):
return a1+a2+a3
'''
效果和django的Filter相似,前端渲染的时候需要注意写法
{
{ 1|db(2,3)}} 1是第一个参数,后面是2,3参数。
'''
7.6 template_global
声明全局可用的模板函数,见模板引擎-变量里的示例