我正在使用pymongo来允许我的Django站点将数据保存到MongoDB。显然,MongoClient()类内置了连接池,并且只应在Django启动时实例化一次。因此,与我的Django站点的每个连接将基本上重用该单个MongoClient。我在网上看到很多信息,表明这是应该做的方式。但是,我找不到任何关于Django究竟在哪里放置MongoClient这个单一实例的建议。大多数Django文献明确表示不会持久存在于所有用户会话中使用的全局变量。
那么我究竟在哪里创建和存储MongoClient的这个单一实例?在views.py?在models.py?别的地方?如果只有一个MongoClient实例,那么内部的连接池究竟有多大帮助?
答案 0 :(得分: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
答案 1 :(得分:2)
继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(...)
这可以变得更加漂亮,例如查看是否在特定连接等的设置中指定了用户和密码,但上述内容捕获了该想法的本质。