文章目录
一、常用装饰器函数
1.视图函数执行前的中间件函数。
想在执行视图函数前,先执行一个装饰器的函数,类似Django的process_request中间件函数一样
from flask import Flask
app = Flask(__name__, template_folder='templates')
@app.before_request
def A():
print('执行函数前先执行我')
@app.route('/index/')
def index():
print('我是视图函数')
return ''
2.视图函数执行后的中间件函数。
想在执行完视图函数,再执行一个装饰器的函数,类似Django的process_response中间件函数一样
from flask import Flask
app = Flask(__name__, template_folder='templates')
@app.before_request
def A():
print('执行函数前先执行我')
@app.after_request
def B(response):
print('执行函数完再执行我')
return response
@app.route('/index/')
def index():
print('我是视图函数')
return ''
if __name__ == '__main__':
app.run(debug=True)
@app.after_request的函数必须要接受视图函数传回的响应,并且return它,否则会报错
3.多个装饰器函数
现在有多个装饰器函数,查看执行顺序
from flask import Flask
app = Flask(__name__, template_folder='templates')
@app.before_request
def A1():
print('执行函数前先执行我1')
@app.before_request
def A2():
print('执行函数前先执行我2')
@app.after_request
def B1(response):
print('执行函数完再执行我1')
return response
@app.after_request
def B2(response):
print('执行函数完再执行我2')
return response
@app.route('/index/')
def index():
print('我是视图函数')
return ''
if __name__ == '__main__':
app.run(debug=True)
原理:
before_request=[A1,A2] 会按顺序执行列表里的装饰器函数
after_request=[B1,B2] 会先将列表执行reverse操作,再执行装饰器函数
4.特别注意
如果在befor_request的函数中如果return返回值,那么不会再执行视图函数,会直接把响应交个after_requesr函数。
5.写一个登录装饰器
@app.before_request
def check_login():
# 如果当前不在login页面,则不需要验证
if request.path=='/login':
return None
# 如果不是login页面,需要验证
user=session.get('user')
if user != 'zs':
return redirect('/login')
二、其他装饰器函数
1.自定义错误页面
@app.error_handlers(404)
def error_404(arg):
'''自定义错误页面,根据状态码定制'''
return "404错误啦"
2.前端直接调用后端函数的装饰器
@app.template_global()
def xx(a1,a2):
return a1+a2
'''
这个装饰器的作用就是,可以在前端直接通过{
{ xx(1,2)}}来调用后端的这个函数。
'''
3.相当于filter的装饰器
@app.template_filter()
def db(a1,a2,a3):
return a1+a2+a3
'''
效果和django的Filter相似,前端渲染的时候需要注意写法
{
{ 1|db(2,3)}} 1是第一个参数,后面是2,3参数。
'''
4.第一次来请求操作的装饰器
@app.before_first_request
def first(*args,**kwargs):
pass
'''
只有第一次请求时候才执行的函数装饰器
'''