请求勾子

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.

 

相关推荐