请求钩子

钩子装饰器

Flask中有几个处理request的装饰器,在请求的特定时机会自动触发,若想人为干预请求的处理,可以注册在特定时机触发的函数即可,如:请求的拦截,响应头的整体设置等,具体装饰器与触发时机对照如下:

装饰器 触发时机
before_first_request 第一次请求前执行,不接收任何参数,返回值会被忽略
before_request 每次请求前执行,不接受任何参数,有返回值则会直接返回,不会继续执行请求,先注册先执行
after_request 每次请求后执行,没有异常时执行,接收一个响应作为参数,返回一个响应,先注册后执行
teardown_request 请求上下文被 pop 出请求栈时,即使有异常也会执行

示例代码

@app.route('/')
def index():
    print('request')
    return 'Hello Flask!'

@app.before_first_request
def before_first_request():
    print('before_first_request')

@app.before_request
def before_request_f1():
    print('before_request_f1')
    # return '123'  # 一旦返回程序则不会继续执行

@app.before_request
def before_request_f2():
    print('before_request_f2')

@app.after_request
def after_request_f1(resp):
    print('after_request_f1')
    return resp

@app.after_request
def after_request_f2(resp):
    print('after_request_f2')
    resp.headers['xxx'] = 'yyy'
    return resp

@app.teardown_request
def teardown_request(error):
    print('teardown_request')
    if error:
        print(error)
  • 访问http://localhost:5000/的执行结果如下:
before_first_request
before_request_f1
before_request_f2
request
after_request_f2
after_request_f1
teardown_request

results matching ""

    No results matching ""