Flask入门(7):内置装饰器(钩子函数)

复习装饰器基础及其应用,可参考文章:闭包和装饰器

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

声明全局可用的模板函数,见模板引擎-变量里的示例

猜你喜欢

转载自blog.csdn.net/qq_43745578/article/details/129131876