请求钩子是通过装饰器的形式实现,Flask支持如下四中请求钩子:
- before_first_request:在处理第一个请求前运行
@app.before_first_request - before_request:在每次请求前运行
- after_request(response):如果没有未处理的异常抛出,在每次请求后运行
- teardown_request(response):在每次请求后运行,即使有未处理的异常
无异常情况下,请求钩子的实现顺序
from flask import Flask,session,current_app,g
app = Flask(__name__)
# flask默认把session保存到了cookie中
@app.route("/index")
def set_cookie():
print("index 被执行")
return "index page"
@app.before_first_request
def handle_before_first_request():
"""
在第一次请求处理之前先被执行
:return:
"""
print("handle_before_first_request 被执行")
@app.before_request
def handle_before_request():
"""
在每次请求前都被执行
:return:
"""
print("handle_before_request 被执行")
@app.after_request
def handle_after_request(response):
"""
在每次请求(视图函数处理之后)都被执行,前提是视图函数没有出现异常
:return:
"""
print("handle_after_request 被执行")
return response
@app.teardown_request
def handle_teardown_request(response):
"""
在每次请求(视图函数处理之后)都被执行,无论视图函数是否出现异常,都被执行
工作在非调试模式时,debug=False
:return:
"""
print("handle_teardown_request 被执行")
return response
if __name__ == '__main__':
app.run()
第一次执行结果
image.png第一次执行结果
第二次执行结果
第二次执行结果异常情况下,请求钩子的实现顺序,在视图函数里加入了a=1/0
from flask import Flask,session,current_app,g
app = Flask(__name__)
# flask默认把session保存到了cookie中
@app.route("/index")
def set_cookie():
print("index 被执行")
a = 1/0
return "index page"
@app.before_first_request
def handle_before_first_request():
"""
在第一次请求处理之前先被执行
:return:
"""
print("handle_before_first_request 被执行")
@app.before_request
def handle_before_request():
"""
在每次请求前都被执行
:return:
"""
print("handle_before_request 被执行")
@app.after_request
def handle_after_request(response):
"""
在每次请求(视图函数处理之后)都被执行,前提是视图函数没有出现异常
:return:
"""
print("handle_after_request 被执行")
return response
@app.teardown_request
def handle_teardown_request(response):
"""
在每次请求(视图函数处理之后)都被执行,无论视图函数是否出现异常,都被执行
工作在非调试模式时,debug=False
:return:
"""
print("handle_teardown_request 被执行")
return response
if __name__ == '__main__':
app.run()
执行结果
补充说明
from flask import Flask,session,current_app,request,url_for
app = Flask(__name__)
@app.route("/index")
def index():
print("index 被执行")
a = 1/0
return "index page"
@app.route("/hello")
def hello():
print("hello 被执行")
return "hello page"
@app.before_first_request
def handle_before_first_request():
"""
在第一次请求处理之前先被执行
:return:
"""
print("handle_before_first_request 被执行")
@app.before_request
def handle_before_request():
"""
在每次请求前都被执行
:return:
"""
print("handle_before_request 被执行")
@app.after_request
def handle_after_request(response):
"""
在每次请求(视图函数处理之后)都被执行,前提是视图函数没有出现异常
:return:
"""
print("handle_after_request 被执行")
return response
@app.teardown_request
def handle_teardown_request(response):
"""
在每次请求(视图函数处理之后)都被执行,无论视图函数是否出现异常,都被执行
工作在非调试模式时,debug=False
:return:
"""
path = request.path
if path == url_for("index"):
print("在请求钩子中,判断请求的视图函数:index")
elif path == url_for("hello"):
print("在请求钩子中,判断请求的视图函数:hello")
print("handle_teardown_request 被执行")
return response
if __name__ == '__main__':
app.run()
运行代码,填写路由,即可查看结果
网友评论