在Django中存放MongoClient的位置

时间:2014-08-28 18:54:30

标签: python django mongodb pymongo

我正在使用pymongo来允许我的Django站点将数据保存到MongoDB。显然,MongoClient()类内置了连接池,并且只应在Django启动时实例化一次。因此,与我的Django站点的每个连接将基本上重用该单个MongoClient。我在网上看到很多信息,表明这是应该做的方式。但是,我找不到任何关于Django究竟在哪里放置MongoClient这个单一实例的建议。大多数Django文献明确表示不会持久存在于所有用户会话中使用的全局变量。

那么我究竟在哪里创建和存储MongoClient的这个单一实例?在views.py?在models.py?别的地方?如果只有一个MongoClient实例,那么内部的连接池究竟有多大帮助?

2 个答案:

答案 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(...)

这可以变得更加漂亮,例如查看是否在特定连接等的设置中指定了用户和密码,但上述内容捕获了该想法的本质。