2012-07-08 106 views
6

在我的Flask應用程序中,我希望直接使用pymongo。但我不確定爲每個請求創建pymongo連接以及如何回收連接資源的最佳方式。如何在Flask中爲每個請求創建pymongo連接

我知道pymongo中的連接是線程安全的並具有內置池。我想我需要創建一個全局連接實例,並使用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 

在管理/ views.py:

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

它的實際工作。所以問題是:

  1. 這是在燒瓶中使用連接的最佳方式?

  2. 我是否需要明確回收teardown_request中的資源以及如何執行此操作?

回答

7

我仍然認爲這是一個有趣的問題,但爲什麼沒有迴應...所以這裏是我的更新。

對於第一個問題,我認爲使用current_app在Flask中更清晰。

在app.py

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

在view.py

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

,並通過使用CURRENT_APP,您可以使用應用程序工廠創建一個以上的應用爲http://flask.pocoo.org/docs/patterns/appfactories/

而且對於第二個問題,我還在搞清楚。

0

我覺得你現在可以。燒瓶在如何組織事物方面幾乎太靈活了,而不是總是以一種明顯而正確的方式呈現。你可以使用flask-pymongo extension,這增加了一些小的便利。據我所知,你不需要在請求拆卸的連接上做任何事情。

2

下面是例如使用燒瓶-pymnongo延伸:在的app.config

您的mongodb的URI(直到分貝名)等下面

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

,然後在您的API方法:

實施例你需要db做以下幾點:

db = mongo.db 

現在你可以使用這個db連接並獲取您的數據:

users_count = db.users.count()