Импорт
Python не включает C или PHP. import somemodule
не внедряет имена, определенные в somemodule
в текущей области, он загружает модуль (если он еще не был) и связывает его с именем somemodule
- тогда вы можете получить доступ к именам, определенным в модуль с использованием квалифицированного пути ie somemodule.SOME_NAME
.
Если вы хотите напрямую связать имена верхнего уровня модуля в импортируемом пространстве имен, вы должны либо сделать это явно (from some_module import SOME_NAME, SOME_OTHER_NAME
et c ) или используйте импорт с подстановочными знаками (from some_module import *
), но это плохая практика, поскольку это приводит к трудностям в диагностике ошибок и к черту общего обслуживания (подсказка: если два из ваших импортированных модулей определяют одно и то же имя, вы получите только последнее импортированное one).
За прошедшие годы я пробовал довольно много решений, и ни одно из них не было действительно удовлетворительным, поэтому сейчас я просто пишу полный автономный файл настроек для каждой среды (local, preview, preprod, prod) и использую хук моей virtualenv post_activate, чтобы DJANGO_SETTINGS_MODULE
envvar указывал на нужный файл настроек.
Для настроек по умолчанию для каждого приложения я использую модуль app/settings
, который ch импортирует django.conf.settings
и устанавливает значение по умолчанию, если оно еще не определено, затем используйте этот модуль приложения / настроек (вместо django .conf.settings) в приложении, ie:
# myapp/settings.py
from django.conf import settings
SOMETHING = getattr(settings, "MYAPP_SOMETHING", 42)
ANOTHER = getattr(settings, "MYAPP_ANOTHER", False)
then
# myapp/models.py
from . import settings
class Foo(models.Model):
bar = models.IntegerField(default=settings.SOMETHING)
В случае необходимых настроек приложения, я проверяю их в файле настроек моего приложения:
# myapp/settings.py
from django.exceptions import ImproperlyConfigured
from django.conf import settings
SOMETHING = getattr(settings, "MYAPP_SOMETHING", 42)
ANOTHER = getattr(settings, "MYAPP_ANOTHER", False)
try:
REQUIRED = getattr(settings, "MYAPP_REQUIRED")
except AttributeError:
raise ImproperlyConfigured("you must defined settings.MYAPP_REQUIRED")
Эта схема также позволяет проверять пользовательские настройки, ie если вы ожидаете int и пользователь использовал строку:
SOMETHING = getattr(settings, "MYAPP_SOMETHING", 42)
if not isinstance(SOMETHING, int):
raise ImproperlyConfigured("settings.MYAPP_SOMETHING must be an int")