Django圆形imp

2024-04-20 06:19:12 发布

您现在位置:Python中文网/ 问答频道 /正文

在django应用程序中,在开始处的设置文件中(在定义任何设置之前),我有如下内容:

from myapp.log_filters import add_uid

myapp.log_filters我有:

^{pr2}$

我认为这会导致循环导入,但不知怎么回事,为什么?在

当然,如果我在开始时导入我需要的实际设置,而不是在函数add_uid中使用它作为settings.USERID,那么我会得到一个错误——这是有意义的。所以我还是不明白为什么我们没有一个循环导入错误,从一个文件导入设置,它本身是由设置文件导入的。。。在

如有任何相关文件的链接,我们将不胜感激。在

谢谢。在


Tags: 文件django函数fromimportlogadd应用程序
1条回答
网友
1楼 · 发布于 2024-04-20 06:19:12

在官方文件中搜索一小段时间,除了following sentence

Note that django.conf.settings isn't a module it's an object. So importing individual settings is not possible:

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

这就解释了为什么导入settings.USEDID会引发错误。

进一步浏览^{}'s source code,我发现{}实际上是{a3}。以下是相关代码片段,但有一些遗漏:

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中导入来验证这一点。

相关问题 更多 >