Настройки django для каждого приложения - лучшая практика?
это несколько связано с этим вопросом
Почему объект настроек django является LazyObject?
В моем проекте django у меня есть несколько приложений. Каждое приложение может иметь свой собственный нетривиальный файл настроек.
proj/
proj/
settings.py
app/
settings.py
views.py
Какая общая рекомендация здесь?
должен app/settings.py делать
from django.conf import settings
APP_SETTING= lambda: settings.getattr('APP_SETTING', 'custom_value')
PROJ_SETTING= lambda: settings.PROJ_SETTING
а затем в app/views.py do
import .settings
X = settings.APP_SETTING
Y = settings.PROJ_SETTING
или мне следует изменить объект ленивых настроек django в app/settings.py в соответствии со стилем кодирования django?
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')
а затем каждое приложение /views.py просто потребляет proj/settings.py через настройки django.conf?
from django.conf import settings
X = settings.APP_SETTING
Y = settings.PROJ_SETTING
Есть, очевидно, немало других перестановок, но я думаю, что мои намерения ясны.
Спасибо заранее.
Ответы
Ответ 1
Самое простое решение - использовать трюк getattr(settings, 'MY_SETTING', 'my_default')
, о котором вы говорите сами. Это может стать немного утомительным, чтобы сделать это в нескольких местах.
Дополнительная рекомендация: используйте префикс для каждого приложения, например MYAPP_MY_SETTING
.
Однако есть приложение django, которое избавляется от getattr
и обрабатывает префикс для вас. См. http://django-appconf.readthedocs.org/en/latest/
Обычно вы создаете conf.py
для каждого приложения таким образом:
from django.conf import settings
from appconf import AppConf
class MyAppConf(AppConf):
SETTING_1 = "one"
SETTING_2 = (
"two",
)
И в вашем коде:
from myapp.conf import settings
def my_view(request):
return settings.MYAPP_SETTINGS_1 # Note the handy prefix
Если вам нужно настроить параметры на своем сайте, вам потребуется только регулярная запись на вашем сайте settings.py
:
MYAPP_SETTINGS_1 = "four, four I say"
Ответ 2
Не уверен в лучших практиках, но у меня нет проблем со следующим стилем:
проектируемый/settings.py
OPTION_A = 'value'
# or with namespace
APP_NAMESPACE = 'APP'
APP_OPTION_B = 4
приложение/settings.py
from django.conf import settings
from django.utils.functional import SimpleLazyObject
OPTION_A = getattr(settings, 'OPTION_A', 'default_value')
# or with namespace
NAMESPACE = getattr(settings, APP_NAMESPACE, 'APP')
OPTION_B = getattr(settings, '_'.join([NAMESPACE, 'OPTION_B']), 'default_value')
OPTION_C = getattr(settings, '_'.join([NAMESPACE, 'OPTION_C']), None)
if OPTION_C is None:
raise ImproperlyConfigured('...')
# lazy option with long initialization
OPTION_D = SimpleLazyObject(lambda: open('file.txt').read())
приложение/views.py
from .settings import OPTION_A, OPTION_B
# or
from . import settings as app_settings
app_settings.OPTION_C
app_settings.OPTION_D # initialized on access