文章目录
一、常用装饰器函数
1.视图函数执行前的中间件函数。
- 一、常用装饰器函数
-
- 1.视图函数执行前的中间件函数。
- 2.视图函数执行后的中间件函数。
- 3.多个装饰器函数
- 4.特别注意
- 5.写一个登录装饰器
- 二、其他装饰器函数
-
- 1.自定义错误页面
- 2.前端直接调用后端函数的装饰器
- 3.相当于filter的装饰器
- 4.第一次来请求操作的装饰器
想在执行视图函数前,先执行一个装饰器的函数,类似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 ''
想在执行完视图函数,再执行一个装饰器的函数,类似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它,否则会报错
现在有多个装饰器函数,查看执行顺序
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 ''' 只有第一次请求时候才执行的函数装饰器 '''