4

我想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".

让我感到困惑的是,一旦我关闭 DEBUG 模式app.run(debug=False),异常显示正确:

Teardown 1 Exception('bacoff',)
>>>> Exception Happaned <<<<
good

所以,我不知道这是Flask框架的错误,还是我的配置错误......

我的环境是:

  • 美丽汤 3.2.1
  • 烧瓶 0.9
  • 烧瓶登录 0.1.3
  • 烧瓶邮件 0.8.2
  • Flask-OpenID 1.1.1
  • Flask-SQLAlchemy 0.16
  • 烧瓶-WTF 0.8.3
  • Flask-WhooshAlchemy 0.55a
  • Jinja2 2.6
  • SQLAlchemy 0.8.1
  • 坦皮塔 0.5.1
  • WTForms 1.0.3
  • Werkzeug 0.8.3
  • 嗖嗖 2.4.1
  • 闪光灯 1.2
  • 装饰器 3.4.0
  • lxml 3.2.0
  • pycurl 7.19.0
  • python-openid 2.2.5
  • 请求 1.2.0
  • sqlalchemy-迁移 0.7.2
  • wsgiref 0.1.2
4

2 回答 2

2

我终于通过添加解决了

app.config['PRESERVE_CONTEXT_ON_EXCEPTION'] = False

解决方案来自http://github.com/mitsuhiko/flask/issues/661#issuecomment-11975645

于 2013-05-16T12:50:33.493 回答
0

查看dispatch_requestand full_dispatch_request:首先调用您的视图,然后捕获您的视图异常。您可以简单地dispatch_request使用您的错误处理程序覆盖,但Flask为此提供了特殊机制:error_handler_spec. 因此,您可以使用errorhandlerregister_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()
于 2013-05-13T06:12:08.530 回答