2014-09-25 66 views
0

在Django應用程序中,設置正確的文件開頭(所有的設置已被定義之前),我有這樣的事情:Django的圓形進口

from myapp.log_filters import add_uid 

myapp.log_filters我:

from django.conf import settings 

,我會希望導致循環進口,但是好像沒有。爲什麼?

當然,如果我要在開始時導入實際需要的設置,而不是在函數add_uid中使用它作爲settings.USERID,那麼我會得到一個錯誤 - 這是有道理的。所以,我還是不明白,爲什麼我們沒有從那個是本身的設置文件導入文件導入設置的圓形進口錯誤...

相關文件的所有鏈接將非常感激。

謝謝。

+0

錯誤是由設置在做進口USERID其失敗。您在下面給出的解釋是正確的。謝謝 :) – Sofia 2014-09-25 13:18:26

回答

1

在官方的文檔很短的搜索沒有發現任何實質性的,除了following sentence

注意django.conf.settings是不是一個模塊 - 它是一個對象。所以,在導入單獨的設置是不可能的:

from django.conf.settings import DEBUG # This won't work. 

這就解釋了爲什麼只導入settings.USEDID引發錯誤。

進一步瀏覽django's source code,我發現settings實際上是lazy evaluated。下面是相關的代碼片段,一些疏漏:

class LazyObject(object): 

    # Avoid infinite recursion when tracing __init__ (#19456). 
    _wrapped = None 

    def __init__(self): 
     self._wrapped = empty 

ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE" 

class LazySettings(LazyObject): 
    def _setup(self, name=None): 
     settings_module = os.environ.get(ENVIRONMENT_VARIABLE) 
     ... 
     self._wrapped = Settings(settings_module) 

    def __getattr__(self, name): 
     if self._wrapped is empty: 
      self._setup(name) 
     return getattr(self._wrapped, name) 

class Settings(BaseSettings): 
    def __init__(self, settings_module): 
     ... 
     # store the settings module in case someone later cares 
     self.SETTINGS_MODULE = settings_module 

     mod = importlib.import_module(self.SETTINGS_MODULE) 

只有當settings一些屬性被訪問發生。因此您的特定設置文件的實際進口的嘗試。
您可以輕鬆地運行pdb跟蹤,當您的模塊從django內進口看着驗證這一點。