Кажется, что каждое решение, которое я вижу там, имеет тенденцию создавать внутреннюю копию настроек приложения, прокси, переноса или чего-то еще.Это сбивает с толку и создает проблемы, когда настройки изменяются во время выполнения, как они это делают в тестах .
Для меня все настройки принадлежат django.conf.settings
и только там.Вы не должны ни читать их откуда-либо, ни копировать их для последующего использования (так как они могут измениться).Вы должны установить их один раз и не беспокоиться о настройках по умолчанию позже.
Я понимаю побуждение отбрасывать префикс приложения при внутреннем использовании настроек приложения, но это тоже ИМХО плохая идея.В случае проблем поиск SOME_APP_FOO
не даст результатов, так как он используется так же, как и FOO
для внутренних целей.Смущает правильно?И за что, мало букв?Помните , что явное лучше ?
ИМХО лучший способ - просто установить эти значения по умолчанию в собственных настройках Django, и почему бы не использовать уже существующие трубопроводы?Никакие перехваты импорта или перехвата модулей models.py
не импортируются всегда для инициализации некоторых дополнительных и сложных мета-классов.
Почему бы не использовать AppConfig.ready для установки значений по умолчанию?
class FooBarConfig(AppConfig):
name = 'foo_bar'
def ready(self):
from django.conf import settings
settings = settings._wrapped.__dict__
settings.setdefault('FOO_BAR_SETTING', 'whatever')
Или еще лучше определить их простым и понятным способом в отдельном модуле и импортировать их как (или почти как) Класс настроек делает это:
class FooBarConfig(AppConfig):
name = 'foo_bar'
def ready(self):
from . import app_settings as defaults
from django.conf import settings
for name in dir(defaults):
if name.isupper() and not hasattr(settings, name):
setattr(settings, name, getattr(defaults, name))
Я неКонечно, использование __dict__
- лучшее решение, но вы поймете, что вы всегда можете использовать комбо hasattr
/ setattr
, чтобы получить эффект.
Таким образом, настройки вашего приложения:
- открыт для других - если они должны полагаться на них в некоторых редких случаях, если, конечно, приложения настроены для того, чтобы полагаться друг на друга
- читается нормально, как любой другой параметр
- красиво объявлено в их собственном модуле
- достаточно ленивый
- контролирует, как они установлены в
django.conf.settings
- вы можете реализовать некоторое преобразование имен, если хотите
PS.Есть предупреждение о том, что не нужно изменять настройки во время выполнения , но оно не объясняет почему.Поэтому я думаю, что это один раз, во время инициализации может быть разумным исключением;)
PS2.Не называйте отдельный модуль просто settings
, так как это может привести к путанице при импорте settings
из django.conf
.