请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:
1、before_first_request
: 在第一次请求处理之前先被执行
2、before_request
: 在每次请求前执行
3、after_request
: 在每次请求处理之后被执行
- 接受一个参数:视图函数的响应
- 在此函数中可以对响应值在返回之前做最后一步修改处理
- 需要将参数中的响应在此参数中进行返回
4、teardown_request
: 在每次请求后执行 - 接受一个参数:错误信息,即服务器出错的信息, 没有错误则为 None
- 需要在非调式模式下运行
#coding=utf-8from flask import Flaskapp = Flask(__name__)@app.route("/testA")
def index1():return 'welcome hello'@app.route("/testB")
def index2():a = str(1 / 0)return a@app.before_first_request #在第一次请求处理之前先被执行
def handle_before_first_request():print("before_first_request called")@app.before_request #在每次请求处理之前都被执行
def handle_before_request():print("before_request called")@app.after_request #在每次请求处理之后被执行
def handle_after_request(response001):print("after_request called")print(response001)return response001@app.teardown_request #在每次请求处理之后都被执行,有没有异常都执行
def handle_teardown_request(error001):"""工作在非调试模式下(生产模式):param: errors: 服务器出错的信息, 没有错误则为 None"""print("teardown_request called")print(error001)if __name__ == "__main__":app.run()
分析:
1、第一次访问http://127.0.0.1:5000/testA,控制台输出:
before_first_request called #第一次服务请求前执行结果
before_request called #每次服务请求前执行结果
after_request called #每次请求后执行结果,返回视图函数的响应内容,如下<Response 13 bytes [200 OK]>
<Response 13 bytes [200 OK]>
teardown_request called #在每次请求后执行结果,没有错误则返回如下None
None
第二次访问http://127.0.0.1:5000/testA,控制台输出:
before_request called #每次服务请求前执行结果
after_request called 每次请求后执行结果 #每次请求后执行结果,返回视图函数的响应内容,如下<Response 13 bytes [200 OK]>
<Response 13 bytes [200 OK]>
teardown_request called #在每次请求后执行结果,没有错误则返回如下None
None
2、第一次访问http://127.0.0.1:5000/testB
before_first_request called #第一次服务请求前执行结果
before_request called #每次服务请求前执行结果
after_request called #每次请求后执行结果,返回视图函数的响应内容,如下<Response streamed [500 INTERNAL SERVER ERROR]>
<Response streamed [500 INTERNAL SERVER ERROR]>
teardown_request called 在每次请求后执行结果,返回如下错误信息division by zero
division by zero #出错信息