2013-12-03 2 views
3

Итак, у меня есть несколько файлов настроек 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' 

ответ

5

__name__ - имя, под которым был импортирован текущий модуль.

Если модуль был импортирован с import saml.xyz, __name__ отражает это напрямую. Если вы иногда видите apps.saml.xyz, то ваш модуль был импортирован с использованием , что имя, и есть две копии вашего модуля, загруженные в память; Python видит их как отдельные.

Вам следует избегать импорта вложенных модулей; использование только название верхнего уровня. Придерживайтесь либо apps.saml.xyz, либо saml.xyz, но если последнее необходимо использовать, убедитесь, что apps/: не пакет и сам не указан на пути поиска модуля python sys.path.

+0

Итак, я пошел через весь проект, заменяя 'from apps.'' '' ', так что проблема была невозможна. Это все еще произошло. Затем я подумал об INSTALLED_APPS, удалил «apps.» оттуда, и проблема решена. Я до сих пор не знаю, как это могут повлиять на различные файлы настроек. Поскольку INSTALLED APPS был обычным явлением, приложения не импортируются из модуля настроек. – boatcoder

+0

@ Mark0978: Это означает, что и каталог 'apps /' сам *, и * его родительский каталог перечислены в 'sys.path' и что существует' __init__.py' file * в * 'apps /'. Это заставляет 'apps' работать как как пакет *, так и * каталог верхнего уровня для Python для поиска модулей, и вы не хотите иметь их обоих. Это приводит к ошибкам, подобным этим. –

+0

Итак, я должен положить 'from apps.' обратно и убедиться, что' apps/'НЕ находится в пути python? Я действительно предпочитаю, чтобы «apps.» в импорте указывали, какие из них являются частью этого проекта, кроме внешних приложений. – boatcoder

Смежные вопросы