请求勾子
before_request
在处理路由规则对应的view_function
之前执行的函数, 并且执行顺序是先绑定先执行, 并且先执行flask app
的before_request
, 再处理blueprint
的before_request。
示例:
from flask import Flask, request app = Flask(__name__) @app.route("/fromuser/<name>") def user(name): return "<h1> Hello, {} !</h1>".format(name) @app.before_request def before_exec(): print("Start...") if __name__ == '__main__': app.run() 结果: 请求地址: http://127.0.0.1:5000/fromuser/liming 先后台打印Start.., 然后页面返回请求
errorhandler: 被触发的前提是 view_function
中抛出了错误, 并且错误码能够匹配上注册的 errorhandler
的错误码.
示例:
from flask import Flask, request, render_template, abort app = Flask(__name__) @app.route("/fromuser/<name>") def user(name): if name == 'liming': abort(404) # 1、返回404错误码 return "<h1> Hello, {} !</h1>".format(name) @app.before_request def before_exec(): print("Start...") @app.after_request def after_exec(response): # 此处必须有参数 print("i am ok...") return response @app.errorhandler(404) # 2、接收404错误码,执行err_exec def err_exec(response): print("ERR") if __name__ == '__main__': app.run()
after_request
被触发的前提是没有异常抛出; 或者异常被 errorhandler
接住并处理. 并且 after_request
执行的顺序是先绑定后执行.
示例
from flask import Flask, request, render_template app = Flask(__name__) @app.route("/fromuser/<name>") def user(name): return "<h1> Hello, {} !</h1>".format(name) @app.before_request def before_exec(): print("Start...") @app.after_request def after_exec(response): # 函数必须有参数 print("i am ok...") return response if __name__ == '__main__': app.run() #运行结果 Start... 页面显示 i am ok...
teardown_request
就和其余的三个不太一样了. 严格的来说 teardown_request
没有固定的执行位置. 因为他直接和请求上下文环境挂钩. 只有在请求上下文被 pop
出请求栈的时候才会触发 teardown_request
, 所以即使之前有抛出错误的时候也会都会被执行, 执行完后返回 response.