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:
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.
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/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.
DJANGO_SETTINGS_MODULEusing 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:
Note that you can run this export at any time from a shell — it does not need to live in your
.bashrc or anything.
DJANGO_SETTINGS_MODULEusing 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:
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.
By default use production settings, but create a file called
settings_dev.py in the same folder as your
settings.py file. Add overrides there, such as
On the computer that will be used for development, add this to your
At the bottom of your
settings.py file, add the following.
# Override production variables if DJANGO_DEVELOPMENT env variable is set if os.environ.get('DJANGO_DEVELOPMENT') is not None: from settings_dev import *
(Note that importing
* should generally be avoided in Python, but this is a unique circumstance)
By default the production servers will not override anything. Done!
Compared to the other answers, this one is simpler because it doesn't require updating
PYTHONPATH, or setting
DJANGO_SETTINGS_MODULE which only allows you to work on one django project at a time.