一.使用
Flask中的特殊裝飾器(中間件)方法常用的有三個
- @app.before_request # 在請求進入視圖函數之前
- @app.after_request # 在請求結束視圖函數之后 響應返回客戶端之前
- @app.errorhandler(404) # 重定義錯誤信息
@before_request def func():pass@after_request def func(ret): # 函數中要加參數pass@app.errorhandler(404) # 錯誤代碼 def error404(errormessage): # 函數中要加參數pass
二.執行順序
1.?before_request返回值為None,正常狀態具體分析
from flask import Flask, request, session, redirectapp = Flask(__name__) app.secret_key = "#$%^&*("@app.before_request # 在請求 之前 def be1():print("be1")@app.before_request # 在請求 之前 def be2():print("be2")@app.before_request # 在請求 之前 def be3():print("be3")@app.route("/") def index():print("index page")return "index page"@app.after_request def af1(vf_ret):# vf_ret.response[0]=b'2000000 OK!'print("af1")return vf_ret@app.after_request def af2(vf_ret):# vf_ret.response[0]=b'2000000 OK!'print("af2")return vf_ret@app.after_request def af3(vf_ret):# vf_ret.response[0]=b'2000000 OK!'print("af3")return vf_ret@app.errorhandler(404) def error404(error_message):print(error_message)# return f"你確定你要查看{request.path}這個頁面嗎?它已經走丟了,你快去找吧 "return redirect("http://baidu.com")if __name__ == '__main__':app.run(debug=True)
?
結果
2.?如果在before_request中返回值不為空
在before_request中返回值不為空的話,那么它會將每一個after_request都走一遍
from flask import Flask, request, session, redirectapp = Flask(__name__) app.secret_key = "#$%^&*("@app.before_request # 在請求 之前 def be1():print('be1')return '111'@app.before_request # 在請求 之前 def be2():print("be2")@app.before_request # 在請求 之前 def be3():print("be3")@app.route("/") def index():print("index page")return "index page"@app.route("/login") def login():print("正在登陸......")session["username"] = "username"return "login"@app.after_request def af1(vf_ret):# vf_ret.response[0]=b'2000000 OK!'print("af1")return vf_ret@app.after_request def af2(vf_ret):# vf_ret.response[0]=b'2000000 OK!'print("af2")return vf_ret@app.after_request def af3(vf_ret):# vf_ret.response[0]=b'2000000 OK!'print("af3")return vf_ret@app.errorhandler(404) def error404(error_message):print(error_message)# return f"你確定你要查看{request.path}這個頁面嗎?它已經走丟了,你快去找吧 "return redirect("http://baidu.com")if __name__ == '__main__':app.run(debug=True)
?
結果:
?