python - Django 从 1.8 升级到 1.9 在 init 中的模型导入中断
问题描述
我遇到了@JohnnyQ 在这里评论过的同样的问题。
我__init__.py
指的是多个导入,而这些导入又是指模型,这些是必需的。
该代码在 django 1.8.x 上运行良好,但在 Django 升级到 1.9.x 时会中断。
我猜这是一些类加载序列问题。在 1.9 wrt 中对触发 AppRegistryNotReady 异常的应用程序中的模型导入进行了哪些更改?
追溯在这里:
Traceback (most recent call last):
File "/Applications/PyCharm CE.app/Contents/helpers/pydev/_pydev_bundle/pydev_monkey.py", line 729, in __call__
ret = self.original_func(*self.args, **self.kwargs)
File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/utils/autoreload.py", line 226, in wrapper
fn(*args, **kwargs)
File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 113, in inner_run
autoreload.raise_last_exception()
File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/utils/autoreload.py", line 249, in raise_last_exception
six.reraise(*_exception)
File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/utils/autoreload.py", line 226, in wrapper
fn(*args, **kwargs)
File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/__init__.py", line 27, in setup
apps.populate(settings.INSTALLED_APPS)
File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/apps/registry.py", line 85, in populate
app_config = AppConfig.create(entry)
File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/apps/config.py", line 90, in create
module = import_module(entry)
File "/usr/local/Cellar/python@2/2.7.17/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/Users/vinod/mycompany/SourceCodes/mycompany_server/mycompany/core/__init__.py", line 1, in <module>
from mycompany.core import care_team
File "/Users/vinod/mycompany/SourceCodes/mycompany_server/mycompany/core/care_team.py", line 8, in <module>
from mycompany.core import models as core_models
File "/Users/vinod/mycompany/SourceCodes/mycompany_server/mycompany/core/models.py", line 16, in <module>
from django.contrib.auth.models import User
File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/contrib/auth/models.py", line 4, in <module>
from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/contrib/auth/base_user.py", line 52, in <module>
class AbstractBaseUser(models.Model):
File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/db/models/base.py", line 105, in __new__
app_config = apps.get_containing_app_config(module)
File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/apps/registry.py", line 237, in get_containing_app_config
self.check_apps_ready()
File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/apps/registry.py", line 124, in check_apps_ready
raise AppRegistryNotReady("Apps aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
解决方案
Django 1.9 引入了应用注册表,如文档中所述,它通过 3 个步骤进行初始化。
首先,它导入 INSTALLED_APPS 中的所有项目。在这个阶段,代码不应该导入任何模型。
其次,Django 尝试导入每个应用程序的模型子模块,如果它们存在的话。
- 第三,Django
.ready()
在每个应用程序配置上运行。
在core/__init__.py
中,有care_team
import ,而 import 又是在导入 this from django.contrib.auth.models import User
。在应用程序级别初始化时应避免此模型导入。
这应该延迟加载。或者需要重构代码,以便在应用程序初始化期间不会导入任何模型。
推荐阅读
- php - 如何在 PHP 中检查我的 MySQL 连接?
- arduino - 将 esp01 与 arduino mega 集成的问题
- java - Android WebView 无法打开某些网页 - 不支持浏览器使用 chrome
- bash - Bash - 如何在 bash 中捕获前台和后台进程日志
- java - javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: 无法使用 executeQuery() 发出数据操作语句
- laravel - 为集合分页,Laravel
- javascript - 无法从函数 Javascript/Node.JS 中检索值
- javascript - 如何以一种颜色制作闪烁的背景(通知)
- twilio - Twilio Flow - 带有上一步输入参数的 Http 请求
- python - Selenium - 在输入字段中输入四位数字更改五位数字