What is the recommended way of handling settings for local development and the production server? Some of them (like constants, etc) can be changed/accessed in both, but some of them (like paths to static files) need to remain different, and hence should not be overwritten every time the new code is deployed.
Currently, I am adding all constants to
settings.py. But every time I change some constant locally, I have to copy it to the production server and edit the file for production specific changes... :(
Edit: looks like there is no standard answer to this question, I've accepted the most popular method.
try: from local_settings import * except ImportError as e: pass
You can override what needed in
local_settings.py; it should stay out of your version control then. But since you mention copying I'm guessing you use none ;)
Two Scoops of Django: Best Practices for Django 1.5 suggests using version control for your settings files and storing the files in a separate directory:
project/ app1/ app2/ project/ __init__.py settings/ __init__.py base.py local.py production.py manage.py
base.py file contains common settings (such as MEDIA_ROOT or ADMIN), while
production.py have site-specific settings:
In the base file
INSTALLED_APPS = ( # common apps... )
In the local development settings file
from project.settings.base import * DEBUG = True INSTALLED_APPS += ( 'debug_toolbar', # and other apps for local development )
In the file production settings file
from project.settings.base import * DEBUG = False INSTALLED_APPS += ( # other apps for production site )
Then when you run django, you add the
# Running django for local development $ ./manage.py runserver 0:8000 --settings=project.settings.local # Running django shell on the production site $ ./manage.py shell --settings=project.settings.production
The authors of the book have also put up a sample project layout template on Github.