2014-09-25 61 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内进口看着验证这一点。