2014-08-28 66 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更漂亮,例如查看是否在特定连接的设置中指定了用户名和密码等,但以上内容捕捉到了这个想法的实质。