Django循环导入

时间:2014-09-25 11:36:22

标签: python django python-import

在django应用程序中,在开头的设置文件中(在定义任何设置之前)我有类似这样的内容:

from myapp.log_filters import add_uid

myapp.log_filters我有:

from django.conf import settings

我希望导致循环导入,但不知何故它不会。为什么?

当然,如果我在开头导入我需要的实际设置而不是在函数settings.USERID中将其用作add_uid,那么我会得到一个错误 - 这是有道理的。所以我仍然不知道为什么我们从导入设置文件的文件导入设置时没有循环导入错误...

非常感谢任何相关文档的链接。

感谢。

1 个答案:

答案 0 :(得分: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内导入模块的时间来轻松验证这一点。