在Django中存储MongoClient的位置

5 投票
2 回答
1512 浏览
提问于 2025-04-18 18:53

我正在使用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

撰写回答