如何在Flask中为每个请求创建pymongo连接

map*_*ple 7 python connection pymongo flask

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

我知道pymongo中的Connection是线程安全的,并且内置了池.我想我需要创建一个全局的Connection实例,并使用before_request将它放入flask 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
Run Code Online (Sandbox Code Playgroud)

在admin/views.py中:

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

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

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

  2. 我是否需要在teardown_request中明确回收资源以及如何执行此操作?

map*_*ple 7

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

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

在app.py中

app = Flask(__name__)
connection = Connection()
db = connection['test']
app.db = db
Run Code Online (Sandbox Code Playgroud)

在view.py中

from Flask import current_app
db = current_app.db
# do anything with db
Run Code Online (Sandbox Code Playgroud)

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

而对于第二个问题,我还在搞清楚.