Django:在try except块中导入会导致ImportError

3

我有两个模块相互导入一些内容:

project/urls.py:

from modules.helpers import helper

urlpatterns = [
    # patterns
]

modules/helpers.py:

def helper():
    # some magic

def main():
    from project.urls import urlpatterns
    # process urlpatterns

modules/__init__.py:

from modules.helpers import main
main()

有一切正常,直到我将from project.urls import urlpatterns这行代码进行如下包装:

And everything works fine

def main():
    try:
        from project.urls import urlpatterns
    except Exception as e:
        print(str(e))

它会打印:

无法从部分初始化的模块“urls”中导入名称“urlpatterns”(很可能是由于循环导入而导致)(/Users/MaxCore/Documents/www/project/project/urls.py)

可能的原因是什么?

编辑

在最小可重现示例中,一切都正常工作,可能的异常与django有关。由于尝试捕获块,导入顺序发生了变化。


如果我在settings.INSTALLED_APPS中指定modules(不需要),并且运行runserver,它将打印:

django.core.exceptions.AppRegistryNotReady:应用程序尚未加载。


正如错误信息所提到的,循环导入可能是原因。你有调查过吗? - mkrieger1
@mkrieger1 我想知道为什么它不是原因,当它不在try except块中时。 - MaxCore
1
我明白了。你能否创建一个不涉及Django的[mre],即填写# some magic等内容以使其运行并添加一个调用main的顶级脚本,且代码量最少? - mkrieger1
@mkrieger1 是的,我刚刚做了,一切都正常,这似乎与 Django 有关(我得想一想)。 - MaxCore
你在示例代码中将绝对导入更改为相对导入。这是故意的并反映了你实际所做的吗? - Ginnungagap
1个回答

0

我仍然不理解为什么try-except块会改变加载顺序的深层原因,但我已经找到了一个解决方案:

  1. modules添加到settings.INSTALLED_APPS
  2. modules/目录下创建apps.py文件,并添加以下内容:
from django.apps import AppConfig

class ModulesConfig(AppConfig):
    name = 'modules'

    def ready(self):
        from module.helpers import main
        main()
  1. modules/__init__.py 中添加 default_app_config = 'core.apps.ModulesConfig'

1
所以 urlpatterns 加载 views,views 加载 models。你正在从 __init__ 中执行此操作,这是一个重大的失误,因为它总是在引用应用程序时的第一件事情,而 Django 还没有加载模型的机会。 - user1600649

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接