flask after_request抛异常依然会执行

Cheney
  • 4
新手上路,请多包涵

根据我的理解,如果代码报错了,那么after_request装饰器下的函数是不会执行的,但是下面这段代码

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    a = b  # 这里应该会报错
    return 'hello world'

@app.after_request
def after_request(response):
    print('after_request')
    return response

app.run(debug=False)

输出结果为:

NameError: name 'b' is not defined
127.0.0.1 - - [17/Jul/2019 23:30:41] "GET / HTTP/1.1" 500 -
**after_request**

这里还是打印出了after_request,有点没搞懂

回复
阅读 2.1k
1 个回答

这个问题和after_request的设计有关,点击这里可以查看相应的issue。

设置DEBUG模式的方法可以参考官方文档。你可以设置环境变量FLASK_DEBUG1,再次运行应用就会发现after_request在抛出异常后不会被执行。

简单来说,after_request在DEBUG模式下,抛出异常不会被执行,但是如果是非DEBUG模式的话就会被执行。如果你需要一个稳定的、在任何模式下抛出异常后会执行的函数,则可以考虑teardown_request,因为它无论是否抛出异常最终都会被执行。

宣传栏