flask支持如下四种钩子: (1)before_first_request:在第一次请求处理之前先被执行 (2)before_request:在每次请求之前先被执行 (3)after_request:在每次请求(视图函数处理)之后被执行,前提是视图函数没有出现异常,工作在调试模式下(debug=True) (4)teardown_request:在每次请求(视图函数处理)之后被执行,无论视图函数是否出现异常都会执行,工作在非调试模式下(debug=False) 实现代码如下:
from flask import Flask,session,url_for,request
app = Flask(__name__)
@app.route("/first")
def index():
print("first被执行")
return "first page"
@app.route("/second")
def hello():
print("second 被执行")
return "second page"
@app.route("/third")
def index_1():
print("third 被执行")
return "third page"
@app.route("/fourth")
def hello_1():
print("fourth 被执行")
a = 1/0
return "fourth page"
@app.route("/")
def chu_shi():
return "success"
@app.before_first_request
def handle_before_first_request():
"""在第一次请求处理之前先被执行"""
print("handle_before_first_request 被执行")
@app.before_request
def handle_before_request():
"""在每次请求之前先被执行"""
print("handle_before_request 被执行")
@app.after_request
def handle_after_request(response):
"""在每次请求(视图函数处理)之后被执行,前提是视图函数没有出现异常"""
print("handle_after_request 被执行")
return response
@app.teardown_request
def handle_teardown_request(response):
"""在每次请求(视图函数处理)之后被执行,无论视图函数是否出现异常都会执行,工作在非调试模式下(debug=False)"""
path = request.path
if path in [url_for("first"),url_for("second")]:
print("在请求钩子中判断请求的视图逻辑:first or second")
elif path in [url_for("third"),url_for("fourth")]:
print("在请求钩子中判断请求的视图逻辑:third or fourth")
print("handle_teardown_request 被执行")
return response
if __name__ == '__main__':
app.run(debug = False,port=8000)
在调试模式下,若视图函数无报错,after_request装饰下的函数会执行,该函数要接收返回值,所以要用参数进行接收,在非调试模式下,无论视图函数是否报错,teardown_request装饰下的函数都会执行,因此若需要一个稳定的,在任何情况下都执行的函数,可以优先考虑使用teardown_request。
|