所以我有幾個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__
給一個文件,以及我的不同設置文件如何在不改變sys.path的情況下影響__name__
?
的命令是其它方面相同:
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'app''替換''來完成整個項目,所以這個問題是不可能的。它仍然發生。然後我想到了INSTALLED_APPS,從那裏刪除了'apps.',問題就解決了。我仍然不知道不同的設置文件如何導致這種情況。由於它安裝的應用程序很常見,沒有應用程序從設置模塊導入。 – boatcoder
@ Mark0978:這意味着'apps /'目錄本身*和*它的父目錄都列在'sys.path'中,並且有'__init__。py'文件*在*'apps /'中。這使'apps'既可以作爲一個包,也可以作爲Python的頂級目錄來查找模塊,而且你不想同時擁有這兩個模塊。它導致像這樣的錯誤。 –
所以我應該把'from apps.'放回去,並確保'apps /'不在python路徑中?我實際上更喜歡導入中的'apps.'來指出哪些是該項目的一部分,而不是外部應用程序。 – boatcoder