Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Where to store MongoClient in Django

I'm using pymongo to allow my Django site to save data to MongoDB. Apparently the MongoClient() class has connection pooling built in, and it should only be instantiated once when Django starts up. So each connection to my Django site will basically reuse that single MongoClient. I see lots of information on the web that states that this is the way it should be done.However, I cannot find any suggestions on where exactly in Django to put this single instance of MongoClient. Most Django literature says explicitly not to persist global variables used across all user sessions.

So where exactly do I create and store this single instance of MongoClient? In views.py? In models.py? Somewhere else? And if there is just a single instance of MongoClient, how exactly does the connection pooling inside help?

like image 870
Marc Avatar asked Jan 09 '23 22:01

Marc


2 Answers

It's a bit late answering this question, but future searchers may find it useful.

If you're only using MongoDB for a few operations (and thus don't want to use the full MongoEngine architecture), you can set up your architecture like this:

# 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)

A more full breakdown may be found here: https://gist.github.com/josephmosby/4497f8a4f675170180ab

like image 140
josephmosby Avatar answered Jan 12 '23 12:01

josephmosby


Further to (and inspired by) josephmosby's answer, I'm using something like the following:

# 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(...)

This could be made fancier, e.g. to see if a user and password are specified in the settings for a particular connection, etc., but the above captures the essence of the idea.

like image 34
Scott Deerwester Avatar answered Jan 12 '23 11:01

Scott Deerwester