2014-08-28 67 views
1

我使用pymongo來允許我的Django站點將數據保存到MongoDB。顯然,MongoClient()類內置了連接池,並且只應在Django啓動時實例化一次。因此,與我的Django站點的每個連接都將基本重用該單個MongoClient。我在網上看到很多信息,說明這是應該完成的方式。但是,我無法找到有關Django中的哪個位置放置MongoClient的單個實例的任何建議。大多數Django文獻都明確表示不要堅持所有用戶會話中使用的全局變量。在Django中存儲MongoClient的位置

那麼我究竟在哪裏創建和存儲這個MongoClient的單個實例?在views.py中?在models.py?別的地方?如果只有一個MongoClient實例,連接池在內部的幫助究竟如何?

+0

我會將它保存在Django應用程序中的'__init __。py'中。這樣它就被實例化了一次。儘管我對你瞭解正確的程序同樣感興趣:) – shaktimaan 2014-08-28 18:56:52

回答

5

回答這個問題有點晚,但未來的搜索者可能會覺得它很有用。

如果你只使用MongoDB的幾個操作(因而不希望使用全MongoEngine架構),你可以設置你的架構是這樣的:

# project/settings.py 
    (place Mongo connection info here) 

# project/__init__.py 
    (declare a global MongoClient here, it will be throughout the app) 

# project/all apps 
    import project.MY_MONGO_CLIENT_NAME 
    (use MongoClient as needed) 

更全面崩潰可以在這裏找到:https://gist.github.com/josephmosby/4497f8a4f675170180ab

0

繼(和靈感)josephmosby的回答,我使用類似以下內容:

# project/settings 

MONGO_DB = { 
    'default': { 
     'HOST': 'localhost', 
     'PORT': 27017 
    }, 
    ... 
} 

# project/__init__.py 

gMongoClient = {} 

# project/utils/mongo_tool.py 

from project import gMongoClient 
from project.settings import MONGO_DB 
import pymongo 

def get_mongo_db(dbname="default"): 
    if dbname in gMongoClient: 
     return gMongoClient[dbname] 

    if dbname in MONGO_DB: 
     with MONGO_DB[dbname] as config: 
      gMongoClient = pymongo.MongoClient(config["HOST"], 
               config["PORT"]) 
    else: 
     gMongoClient[dbname] = None 

    return gMongoClient[dbname] 

# .../view.py 

from utils import mongo_tool 
... 
db = mongo_tool.get_mongo_db() 
results = db["collection"].find(...) 

這可以b e更漂亮,例如查看是否在特定連接的設置中指定了用戶名和密碼等,但以上內容捕捉到了這個想法的實質。