Итак, у меня есть несколько файлов настроек django, один для тестирования, другие для разных клиентов.Откуда берется значение для __name__?
Ни один из этих файлов настроек не меняет sys.path
.
Все они включают в себя уникальный файл настроек базы, содержащий INSTALLED_APPS
.
Большинство файлов есть код, который делает это:
import logging
logger = logging.getLogger(__name__)
logger.error("Something went wrong")
В моих настройках тестовых файлов, модуль __name__
saml.xyz
выглядит так logger.name является saml.xyz
, но когда я использую различные файлы настроек, в модуль __name__
выглядит как apps.saml.xyz
, что делает logger.name apps.saml.xyz
.
Это приводит к пропущению некоторых сообщений в журнале, поскольку обработчик подключен к неправильному месту. Обработчик для saml.xyz
не получит сообщений для apps.saml.xyz
и наоборот. Вся маршрутизация основана на настроенном регистраторе/обработчике, включая приложения . часть или нет.
Так как же python решает, какой __name__
дать файл, и как мои разные файлы настроек могут повлиять на этот __name__
без изменения sys.path?
Эти команды в остальном идентичны:
python manage.py test --settings=projectname.test saml
, который дает
>>> logger.name
'saml.xyz'
или
python manage.py test --settings=projectname.customer saml
, который дает
>>> logger.name
'apps.saml.xyz'
Итак, я пошел через весь проект, заменяя 'from apps.'' '' ', так что проблема была невозможна. Это все еще произошло. Затем я подумал об INSTALLED_APPS, удалил «apps.» оттуда, и проблема решена. Я до сих пор не знаю, как это могут повлиять на различные файлы настроек. Поскольку INSTALLED APPS был обычным явлением, приложения не импортируются из модуля настроек. – boatcoder
@ Mark0978: Это означает, что и каталог 'apps /' сам *, и * его родительский каталог перечислены в 'sys.path' и что существует' __init__.py' file * в * 'apps /'. Это заставляет 'apps' работать как как пакет *, так и * каталог верхнего уровня для Python для поиска модулей, и вы не хотите иметь их обоих. Это приводит к ошибкам, подобным этим. –
Итак, я должен положить 'from apps.' обратно и убедиться, что' apps/'НЕ находится в пути python? Я действительно предпочитаю, чтобы «apps.» в импорте указывали, какие из них являются частью этого проекта, кроме внешних приложений. – boatcoder