【问题标题】:Django: import causes ImportError only when in try except blockDjango:导入仅在尝试除块时才导致 ImportError
【发布时间】:2020-07-13 16:13:51
【问题描述】:

我有两个模块可以相互导入一些东西:

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 包装成这样:

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 我想知道为什么它不是在try except block中的原因
  • 我明白了。你能创建一个不涉及 Django 的minimal reproducible example,即用最少的代码填充# some magic 等使其运行并添加一个调用main 的顶级脚本吗?
  • @mkrieger1 是的,刚刚做到了,一切正常,它确实与 django 有关(必须思考
  • 您在示例代码中将绝对导入更改为相对导入。是否经过深思熟虑并反映了您实际所做的事情?

标签: python django


【解决方案1】:

我仍然不明白 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. default_app_config = 'core.apps.ModulesConfig' 添加到modules/__init__.py

【讨论】:

  • 所以 urlpatterns 加载视图,视图加载模型。您正在从__init__ 执行此操作,这是主要的脚步声,因为它总是在引用您的应用程序时首先执行,在 Django 有机会加载模型之前。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 2017-06-11
  • 2018-01-22
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 2018-01-03
相关资源
最近更新 更多