flask的应用程序上下文和全局连接

时间:2016-07-26 11:04:21

标签: python flask global

我需要创建一个到数据库的连接池,可以在Flask中通过请求重用。文档(0.11.x)建议使用g,即应用程序上下文来存储数据库连接。

问题是在每个请求之前和之后创建和销毁应用程序上下文。因此,对创建的连接数没有限制,并且没有连接被重用。我正在使用的代码是:

def get_some_connection():
    if not hasattr(g, 'some_connection'):
        logger.info('creating connection')
        g.some_connection = SomeConnection()
    return g.some_connection

并关闭连接

@app.teardown_appcontext
def destroy_some_connection(error):
    logger.info('destroying some connection')
    g.some_connection.close()

这是故意的,也就是说,烧瓶每次都想创建一个新连接,或者在我的代码中使用应用程序上下文存在一些问题。此外,如果它的故意是有一个解决方法,以使连接全局。我知道,一些旧的扩展程序会保留app['extension']本身的连接。

1 个答案:

答案 0 :(得分:3)

不,您必须拥有某种全局连接池。 g允许您在请求之间共享状态,因此在调用处理请求的各种模板和函数之间,而不必传递全局'周围的状态,但它并不意味着替换模块全局变量(与模块具有相同的生命周期)。

您当然可以将数据库连接设置为g以确保所有请求代码仅使用一个连接,但您仍然可以从(模块)全局池中提取连接。

我建议您为每个线程创建连接 并汇总它们。您可以从头开始构建(也许使用threading.local对象),或者您可以使用SQLAlchemy这样的项目,它带有优秀的连接池实现。这基本上是Flask-SQLAlchemy extension所做的。