在django应用程序中,在开头的设置文件中(在定义任何设置之前)我有类似这样的内容:
from myapp.log_filters import add_uid
在myapp.log_filters
我有:
from django.conf import settings
我希望导致循环导入,但不知何故它不会。为什么?
当然,如果我在开头导入我需要的实际设置而不是在函数settings.USERID
中将其用作add_uid
,那么我会得到一个错误 - 这是有道理的。所以我仍然不知道为什么我们从导入设置文件的文件导入设置时没有循环导入错误...
非常感谢任何相关文档的链接。
感谢。
答案 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
内导入模块的时间来轻松验证这一点。