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.