Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Separate custom settings variable between development, staging and production

Tags:

django

I'm following the project structure as laid out by Zachary Voase, but I'm struggling with one specific issue.

I'd very much like to have a custom settings boolean variable (let's call it SEND_LIVE_MAIL) that I would be using in the project. Basically, I'd like to use this settings variable in my code and if SEND_LIVE_MAIL is True actually send out a mail, whereas when it is set to False just print its contents out to the console. The latter would apply to the dev environment and when running unittests.

What would be a good way of implementing this? Currently, depending on the environment, the django server uses dev, staging or prd settings, but for custom settings variables I believe these need to be imported 'literally'. In other words, I'd be using in my views something like

from settings.development import SEND_LIVE_MAIL

which of course isn't what I want. I'd like to be able to do something like:

from settings import SEND_LIVE_MAIL

and depending on the environment, the correct value is assigned to the SEND_LIVE_MAIL variable.

Thanks in advance!

like image 221
LaundroMat Avatar asked Nov 22 '25 23:11

LaundroMat


2 Answers

You shouldn't be importing directly from your settings files anyways. Use:

>>> from django.conf import settings
>>> settings.SEND_LIVE_MAIL
True
like image 158
Chris Pratt Avatar answered Nov 25 '25 15:11

Chris Pratt


The simplest solution is to have this at the bottom of your settings file:

try:
    from local_settings import *
except ImportError:
    pass

And in local_settings.py specify all your environment-specific overrides. I generally don't commit this file to version control.

There are more advanced ways of doing it, where you end up with a default settings file and a per-environment override.

This article by David Cramer covers the various approaches, including both of the ones I've mentioned: http://justcramer.com/2011/01/13/settings-in-django/

like image 38
Andrew Ingram Avatar answered Nov 25 '25 16:11

Andrew Ingram