9

在我的 Flask 应用程序中,我希望直接使用 pymongo。但我不确定为每个请求创建 pymongo 连接以及如何回收连接资源的最佳方法是什么。

我知道 pymongo 中的 Connection 是线程安全的并且具有内置池。我想我需要创建一个全局 Connection 实例,并使用 before_request 将其放入烧瓶 g。

在 app.py 中:

from pymongo import Connection
from admin.views import admin
connection = Connection()
db = connection['test']

@app.before_request
def before_request():
    g.db = db

@app.teardown_request
def teardown_request(exception):
    if hasattr(g, 'db'):
        # FIX
        pass

在 admin/views.py 中:

from flask import g
@admin.route('/')
def index():
    # do something with g.db

它确实有效。所以问题是:

  1. 这是在烧瓶中使用 Connection 的最佳方式吗?

  2. 我是否需要在 teardown_request 中明确回收资源以及如何做?

4

3 回答 3

8

我仍然认为这是一个有趣的问题,但为什么没有回应......所以这是我的更新。

对于第一个问题,我认为在 Flask 中使用 current_app 更清晰。

在 app.py 中

app = Flask(__name__)
connection = Connection()
db = connection['test']
app.db = db

在视图.py

from Flask import current_app
db = current_app.db
# do anything with db

通过使用 current_app,您可以使用应用程序工厂创建多个应用程序,如http://flask.pocoo.org/docs/patterns/appfactories/

对于第二个问题,我还在想办法。

于 2012-07-14T19:22:11.880 回答
2

这是使用 flask-pymnongo 扩展的示例:

例子:

app.config 中的 mongodb uri(直到数据库名称),如下所示

app.config['MONGO_URI'] = 'mongodb://192.168.1.1:27017/your_db_name'
mongo = PyMongo(app, config_prefix='MONGO')

然后在您需要 db 的 api 方法下执行以下操作:

db = mongo.db

现在您可以处理此数据库连接并获取数据:

users_count = db.users.count()
于 2015-03-21T07:15:00.950 回答
0

I think what you present is ok. Flask is almost too flexible in how you can organize things, not always presenting one obvious and right way. You might make use of the flask-pymongo extension which adds a couple of small conveniences. To my knowledge, you don't have to do anything with the connection on request teardown.

于 2012-09-22T02:42:50.743 回答