在Django中存储MongoClient的位置
我正在使用pymongo来让我的Django网站能够把数据保存到MongoDB。显然,MongoClient()这个类自带连接池功能,应该在Django启动时只创建一次。所以,每次连接到我的Django网站时,基本上都是在重复使用这个唯一的MongoClient。我在网上看到很多信息都说应该这样做。不过,我找不到具体应该把这个MongoClient的单一实例放在哪里。大多数Django的资料明确表示,不应该持久化跨用户会话的全局变量。
那么,我到底应该在哪里创建和存储这个MongoClient的单一实例呢?是在views.py里?在models.py里?还是在其他地方?如果只有一个MongoClient的实例,那么连接池的功能到底是怎么帮助我们的呢?
2 个回答
4
接着(并受到)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(...)
这段代码可以做得更复杂一些,比如检查某个连接的设置中是否指定了用户名和密码等等,但上面的代码已经抓住了这个想法的核心。
7
虽然现在回答这个问题有点晚,但将来有需要的人可能会觉得有用。
如果你只是想用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