我想在异常发生时回滚db
会话,所以我尝试了:
@app.teardown_request
def teardown_request(exception):
print "Teardown 1 {0!r}".format(exception)
if exception:
print ">>>> Exception Happaned <<<<"
db.session.rollback()
db.session.remove()
print "good"
db.session.remove()
我测试通过强制我的代码出错来引发异常,即使使用它:
raise Exception("bacoff")
但它始终打印"Teardown 1 None"
和"good"
。
让我困惑的是,一旦我按app.run(debug=False)
关闭了DEBUG模式,
例外显示正确:
Teardown 1 Exception('bacoff',)
>>>> Exception Happaned <<<<
good
所以,我不知道这是Flask框架的错误,还是我的配置错误......
我的ENV是:
答案 0 :(得分:1)
我最后通过添加
解决了这个问题app.config ['PRESERVE_CONTEXT_ON_EXCEPTION'] =错误
解决方案来自http://github.com/mitsuhiko/flask/issues/661#issuecomment-11975645。
答案 1 :(得分:0)
查看dispatch_request
和full_dispatch_request
:首先调用您的视图,然后再捕获您的视图异常。您只需使用错误处理程序覆盖dispatch_request
,但Flask
为此提供了特殊机制:error_handler_spec
。
因此,您可以使用errorhandler
或register_error_handler
注册处理程序以捕获异常。
@app.errorhandler(YourException)
def your_exception_handler(exception):
print ">>>> Exception Happaned <<<<"
db.session.rollback()
return 'something wrong', 400
@app.teardown_request
def teardown_request(*args, **kwargs):
print "good"
db.session.remove()