Подтвердить что ты не робот

Настройки 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

Есть, очевидно, немало других перестановок, но я думаю, что мои намерения ясны.
Спасибо заранее.

4b9b3361

Ответ 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