Django: How to manage development and production settings?

django, python

Solution

The `DJANGO_SETTINGS_MODULE` environment variable controls which settings file Django will load.

You therefore create separate configuration files for your respective environments (note that they can of course both `import *` from a separate, "shared settings" file), and use `DJANGO_SETTINGS_MODULE` to control which one to use.

Here's how:

As noted in the Django documentation:

The value of DJANGO_SETTINGS_MODULE should be in Python path syntax, e.g. mysite.settings. Note that the settings module should be on the Python import search path.

So, let's assume you created `myapp/production_settings.py` and `myapp/test_settings.py` in your source repository.

In that case, you'd respectively set `DJANGO_SETTINGS_MODULE=myapp.production_settings` to use the former and `DJANGO_SETTINGS_MODULE=myapp.test_settings` to use the latter.

From here on out, the problem boils down to setting the `DJANGO_SETTINGS_MODULE` environment variable.

Setting `DJANGO_SETTINGS_MODULE` using a script or a shell

You can then use a bootstrap script or a process manager to load the correct settings (by setting the environment), or just run it from your shell before starting Django: `export DJANGO_SETTINGS_MODULE=myapp.production_settings`.

Note that you can run this export at any time from a shell — it does not need to live in your `.bashrc` or anything.

Setting `DJANGO_SETTINGS_MODULE` using a Process Manager

If you're not fond of writing a bootstrap script that sets the environment (and there are very good reasons to feel that way!), I would recommend using a process manager:

- Supervisor lets you pass environment variables to managed processes using a program's `environment` configuration key.

- Honcho (a pure-Python equivalent of Ruby's Foreman) lets you define environment variables in an "environment" (`.env`) file.

Finally, note that you can take advantage of the `PYTHONPATH` variable to store the settings in a completely different location (e.g. on a production server, storing them in `/etc/`). This allows for separating configuration from application files. You may or may not want that, it depends on how your app is structured.

Problem

I have been developing a basic app. Now at the deployment stage it has become clear I have need for both a local settings and production settings. It would be great to know the following: - How best to deal with development and production settings. - How to keep apps such as django-debug-toolbar only in a development environment. - Any other tips and best practices for development and deployment settings.

Original source

Related problems