Flask(5):Flask的装饰器函数

一、常用装饰器函数

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
'''
只有第一次请求时候才执行的函数装饰器
'''

猜你喜欢

转载自blog.csdn.net/qq_40558166/article/details/107775120