Django settings.py с дополнительными импортами странное поведение и ошибки электронной почты [Errno 111] / разъяснение лучшей практики
Я заметил некоторое странное поведение Django и надеюсь получить разъяснения о причинах этого. Отчасти это связано с вопросами вроде этого (Ошибка электронной почты Django), но в большей степени касается лучших практик. Посмотрите на следующую установку:
Чтобы не "перегружать" мой settings.py в моем основном приложении, я импортирую дополнительные файлы поднастроек. Моя структура выглядит примерно так:
main_app
-settings.py
...
utils_app
config
-settings_email.py
-settings_something_else.py
...
utils
-email.py
...
...
'email.py' содержит функцию send_email()
, а файл settings.py основного приложения импортирует следующим образом: from utils_app.config import settings_email
И settings_email.py будет выглядеть примерно так:
EMAIL_HOST='some-host'
EMAIL_PASS=os.environ.get('EMAIL_PASSWORD')
EMAIL...
...
Изначально эти переменные были в моем (по умолчанию) файле main_app settings.py. Когда это было так, отправка электронной почты через функцию Django 'send_mail' была в порядке. После того, как я переместил их, импортируя, как описано выше, они перестали работать, если я специально не называл их при импорте, например, так: from utils_app.config.settings_email import EMAIL_HOST, ...
В документации Django send_mail я не смог найти ничего, касающегося этого вопроса.
Итак, первый вопрос: действительно ли Django не знает, где искать эти переменные, кроме стандартного settings.py, и они должны быть названы там специально, или они должны быть определены внутри папки main_app? Есть предложения?
И второй вопрос: исходя из этого, что именно является лучшей практикой? Я, вероятно, OCD, когда дело доходит до порядка кода и создания конкретных деклараций там, где им место по группировке и значению, в отдельных файлах config и setting. Я в основном не хочу загружать свой основной settings.py всякой всячиной и предпочитаю разделить все это, если могу.
В этом конкретном примере мое "utils_app" содержит все виды полезных функций, настроек, а также модель для общего ведения домашнего хозяйства с записями в базе данных, которые в основном определяют и направляют специфическое поведение всех остальных моделей приложений. Надеюсь, это имеет смысл. Заранее спасибо, что нашли время прочитать это и за помощь.
PS: Просто уточните. Я, конечно, знаю, что в Python нельзя просто импортировать файл или модуль и ожидать, что определенные в нем переменные будут легко доступны, не обращаясь конкретно к модулю с module.variable
или не импортируя каждую переменную явно, как упоминалось выше. Но это не мой вопрос. Мне просто интересно, почему случай A работает лучше, чем случай B, и что на самом деле ищет Django в то время, когда срабатывает send_email()
.