this is somewhat related to this question
Why is django's settings object a LazyObject?
In my django project i have several applications. Each application can have its own non-trivial settings file.
proj/
proj/
settings.py
app/
settings.py
views.py
What is the general best practice here?
should app/settings.py do
from django.conf import settings
APP_SETTING= lambda: settings.getattr('APP_SETTING', 'custom_value')
PROJ_SETTING= lambda: settings.PROJ_SETTING
and then in app/views.py do
import .settings
X = settings.APP_SETTING
Y = settings.PROJ_SETTING
or should I be modifying the django lazy settings object in app/settings.py as per the django coding style?
from django.conf import settings
# not even sure how I would check for a default value that was specified in proj/settings.py
settings.configure(APP_SETTING='custom_value')
and then each app/views.py just consumes proj/settings.py via django.conf settings?
from django.conf import settings
X = settings.APP_SETTING
Y = settings.PROJ_SETTING
There are obviously quite a few other permutations but I think my intent is clear.
Thanks in advance.
Not sure about best practices but I don't have any problems with following style:
proj/settings.py
app/settings.py
app/views.py
The simplest solution is to use the
getattr(settings, 'MY_SETTING', 'my_default')
trick that you mention youself. It can become a bit tedious to have to do this in multiple places, though.Extra recommendation: use a per-app prefix like
MYAPP_MY_SETTING
.There is a django app, however, that gets rid of the
getattr
and that handles the prefix for you. See http://django-appconf.readthedocs.org/en/latest/Normally you create a
conf.py
per app with contents like this:And in your code:
Should you need to customize the setting in your site, a regular entry in your site's
settings.py
is all you need to do: