Skip to content

DOCSP-46328: Django connection configuration #142

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions snooty.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ sharedinclude_root = "https://raw.githubusercontent.com/10gen/docs-shared/main/"
driver-short = "PyMongo"
driver-long = "PyMongo, the MongoDB synchronous Python driver,"
driver-async = "PyMongo Async"
django-odm = "MongoDB Backend for Django"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can this be "Django MongoDB Backend" or are we required to say "MongoDB Backend for Django" ?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can change it! updated

language = "Python"
mdb-server = "MongoDB Server"
mongo-community = "MongoDB Community Edition"
Expand Down
175 changes: 175 additions & 0 deletions source/configure-connection.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
.. _django-connection-configuration:

==================================
Configure Your Database Connection
==================================

.. facet::
:name: genre
:values: reference

.. meta::
:keywords: connection string, URI, server, settings

.. contents:: On this page
:local:
:backlinks: none
:depth: 2
:class: singlecol

Overview
--------

In this guide, you can learn how to connect your Django project to MongoDB
and configure the connection.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FWIW this still reads "funny" to me … if you are connecting your Django project to MongoDB then you've already configured the connection. Feel free to override me because I can be NIT-happy.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reworded


Connection Configuration
------------------------

After installing {+django-odm+} and creating a project, you can configure
your connection to MongoDB in the following ways:

- :ref:`django-connection-configure-manual` by specifying the
``DATABASES`` variable in your project's settings
- :ref:`django-connection-configure-automatic` by using
the ``parse_uri()`` method

.. tip::

To learn how to install the Django ODM and create a
Copy link

@aclark4life aclark4life Jan 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be {+django-odm+} instead of "Django ODM" ?

Django project, visit the :ref:`django-get-started` tutorial.
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note: this link is broken until #132 is merged


.. _django-connection-configure-manual:

Manually Configure Database Settings
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

To manually configure your connection to MongoDB, update
the ``DATABASES`` variable in your project's ``settings.py``
file. Set the ``DATABASES`` variable to a dictionary value containing
the database settings. You must configure the dictionary's
``default`` key to set MongoDB as the default database
connection.

To configure the ``default`` key, assign a nested dictionary as its value.
This nested dictionary has the following keys:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s: i had a hard time understanding this paragraph until i scrolled down to the code example. what do you think about starting with a code example (maybe without any options in it), then going to the table that explains each option, then a fully fleshed out code example?

Suggested change
To manually configure your connection to MongoDB, update
the ``DATABASES`` variable in your project's ``settings.py``
file. Set the ``DATABASES`` variable to a dictionary value containing
the database settings. You must configure the dictionary's
``default`` key to set MongoDB as the default database
connection.
To configure the ``default`` key, assign a nested dictionary as its value.
This nested dictionary has the following keys:
To manually configure your connection to MongoDB, update
the ``DATABASES`` variable in your project's ``settings.py``
file. Set the ``DATABASES`` variable to a dictionary value containing
a key named ``default``, as shown in the following example:
.. code-block:: python
DATABASES = {
"default": {
},
}
Set the ``default`` key to a dictionary that contains the following keys:

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That makes sense, reworked this part!


.. list-table::
:header-rows: 1
:widths: 20 80

* - Key
- Description

* - **ENGINE**
- The backend driver to use for the connection. Set this key to ``"django_mongodb_backend"``.

* - **HOST**
- | Your connection URI. For localhost connections, this key is optional.
| For SRV connections, you must include a scheme prefix (``mongodb+srv://``).
|
| If connecting to a replica set or sharded cluster with multiple hosts, specify
| each host separated by a comma.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s: slight wording suggestion. could also be helpful to include an example, either here or later.

Suggested change
| If connecting to a replica set or sharded cluster with multiple hosts, specify
| each host separated by a comma.
| To specify more than one host, include all hostnames in one string. Use
| a comma to separate each hostname.


* - **NAME**
- The database you want to use.

* - **USER**
- The username for authenticating to the database.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can add if your connection requires no auth you do not need to provide it


* - **PASSWORD**
- The password for your database user.

* - **PORT**
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here you can say the default port is 27017

- | The port number on which the database server is listening.
| For MongoDB Atlas connections, this key is optional.

* - **OPTIONS**
- A dictionary of additional connection options for the database. This key is optional.

Check failure on line 88 in source/configure-connection.txt

View workflow job for this annotation

GitHub Actions / TDBX Vale rules

[vale] reported by reviewdog 🐶 [MongoDB.ConciseTerms] 'more' is preferred over 'additional'. Raw Output: {"message": "[MongoDB.ConciseTerms] 'more' is preferred over 'additional'.", "location": {"path": "source/configure-connection.txt", "range": {"start": {"line": 88, "column": 24}}}, "severity": "ERROR"}

.. _django-manual-config-example:

Example
```````

This example specifies the ``DATABASES`` variable to connect
to a MongoDB deployment with the following configuration:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s:

Suggested change
This example specifies the ``DATABASES`` variable to connect
to a MongoDB deployment with the following configuration:
In this example, the ``DATABASES`` variable specifies the
following connection configuration:


- Connects to the ``my_database`` database
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

q: related to the preceding paragraph: who is the actor in the list? the client, DATABASES, the
connection, the deployment, the app, or something else? It seems to mix client/app behavior ('Connects to the database' with config behavior ('Sets the connection option...')

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was thinking DATABASES. I'll change some of the wording

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wow, English discussion going on here. I would say s/variable to connect to/variable used to connect to/ and reserve further English language usage comments. 😄

- Provides authentication information for a database user
whose username is ``my_user`` and password is ``my_password``
- Uses the default MongoDB port (``27017``)
- Sets the ``retryWrites`` connection option to ``true``,
which configures the driver to automatically retry certain
write operations if they fail
- Sets the ``w`` connection option to ``majority``,
which configures the driver to wait for acknowledgement from a majority
of replica set members before performing write operations

.. code-block:: python

DATABASES = {
"default": {
"ENGINE": "django_mongodb_backend",
"HOST": "mongodb+srv://cluster0.example.mongodb.net",
"NAME": "my_database",
"USER": "my_user",
"PASSWORD": "my_password",
"PORT": 27017,
"OPTIONS": {
"retryWrites": "true",
"w": "majority",
},
},
}

.. tip::
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s: move this to the OPTIONS row above (and take out of tip box to avoid nested admonition)


To see a full list of connection options that you
can set in the ``OPTIONS`` key, see the optional
parameters for `MongoClient <https://pymongo.readthedocs.io/en/4.10.1/api/pymongo/mongo_client.html#pymongo.mongo_client.MongoClient>`__
in the PyMongo API documentation.

.. _django-connection-configure-automatic:

Automatically Configure Database Settings
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

To automatically construct the ``DATABASES`` setting that configures
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

q: does this literally construct the DATABASES variable in that file with that same structure? or does it just have the same effect on the client/connection?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Django MongoDB README says it "constructs a DATABASES setting equivalent to the first example" -- @Jibola is it accurate to say that parse_uri() automatically constructs this setting?

Copy link

@aclark4life aclark4life Jan 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

parse_uri is a convenience method so if it helps to leave it out for clarity's sake then I would do that. That said, DATABASES has to exist and it has to have the required keys. For example, I can run Django without that setting but if I try to access the admin I get

settings.DATABASES is improperly configured. Please supply the ENGINE value. 
Check settings documentation for more details.

Also FWIW my preference for testing is currently: https://github.com/aclark4life/project-templates/blob/main/project_template/project_name/settings/__init__.py#L7 with MONGODB_URI set by direnv.

And finally, please note we currently use parse_uri in the project template.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems accurate to say it's constructing the DATABASES setting, so I'll leave that in.
Since I'm showing how to configure the same settings as the previous example, I'll leave the MONGODB_URI variable that shows how to do that

your MongoDB connection, you can use the ``parse_uri()`` method. This
method accepts the following arguments:

- ``uri``: Your MongoDB connection URI.
- ``conn_max_age``: Configures persistent database connections.
This argument is optional. To learn more, see
`Persistent connections <https://docs.djangoproject.com/en/stable/ref/databases/#persistent-database-connections>`__
in the Django documentation.
- ``test``: Provides a dictionary of settings for test
databases. This argument is optional. To learn more, see
`the TEST setting <https://docs.djangoproject.com/en/stable/ref/settings/#test>`__
in the Django documentation.

Example
```````

The following example uses the ``parse_uri()`` method to connect
to a MongoDB deployment with the same configuration as
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s:

Suggested change
The following example uses the ``parse_uri()`` method to connect
to a MongoDB deployment with the same configuration as
The following example uses the ``parse_uri()`` method to specify
the same connection configuration as

Copy link

@aclark4life aclark4life Jan 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NIT: s/method/function/

the previous :ref:`manual configuration <django-manual-config-example>`
example:

.. code-block:: python

import django_mongodb_backend

MONGODB_URI = "mongodb+srv://my_user:[email protected]/my_database?retryWrites=true&w=majority"
DATABASES["default"] = django_mongodb_backend.parse_uri(MONGODB_URI)

Additional Information
----------------------

To view a sample project that configures a MongoDB database connection,
see the :ref:`django-get-started-connect` step in the Getting Started
tutorial.

To learn more about Django settings, see `Settings <https://docs.djangoproject.com/en/stable/ref/settings/>`__
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NIT for future version mappings. We will need to have the links point to the correlating version. Right now it points to stable

in the Django documentation.
Loading