teardown_request()如何与Python Flask配合使用?

web*_*org 2 python flask flask-sqlalchemy

我收到内部错误消息:

"TimeoutError: QueuePool limit of size 5 overflow 10 reached, connection timed out, timeout 30"
Run Code Online (Sandbox Code Playgroud)

和在线搜索给出了teardown_request()解决方案:

@app.teardown_request
def checkin_db(exc):
    try:
        print "Removing db session."
        db.session.remove()
    except AttributeError:
        pass
Run Code Online (Sandbox Code Playgroud)

现在超时错误消失了。但是我不完全理解teardown_request,看起来在每个请求之后都会调用db.session.remove()吗?还是每个错误?使用此代码安全吗?

jun*_*ony 5

teardown_request在每个请求结束时注册一个要调用的函数,无论该函数成功还是引发异常。这是清理请求作用域对象(如数据库会话/事务)的好地方。这就是您的代码示例所做的全部。

使用该代码是安全的,并且db.session.remove()每次请求后都会被调用(即使请求期间发生异常)

有关更多信息,请参见Flask回调和错误Flask.teardown_request

  • db.session.remove()只是清除数据库会话,而不是Flask会话。默认情况下,烧瓶会话存储在cookie中,该cookie从客户端随每个请求传递。db.session.remove()确保您正在执行的任何数据库事务都已成功提交或已回滚 (2认同)
  • `@app.teardown_request` 和 `@app.teardown_appcontext` 有什么区别? (2认同)