将Django从1.8.6升级到1.9Django.core.exceptions.AppRegistryNotReady:尚未加载应用程序;正在导入模型问题

2024-04-26 00:33:55 发布

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

我正试图从django1.8.6升级到1.9,但是我在尝试让项目正常构建和运行时遇到了麻烦。我更改了许多升级所需的内容,比如在my_app中创建apps.py文件,定义配置并在settings.py中的INSTALLED_APPS中包含它们的点路径(并将INSTALLED_APPS更改为一个列表),但每次都会遇到相同的错误:

django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

对于一些背景信息,项目使用Docker Compose。运行Django服务器的web容器使用的Dockerfile利用paver启动,这样当docker-compose up运行时,将执行以下命令:

^{pr2}$

据我所知,没有一个依赖项与django1.9不兼容,所以我不确定这是否是问题所在。我最初认为唯一不兼容的依赖项是django_hstore,但在1.9正式发布后不久,它就进行了兼容性更新。因此,除非django_hstore的创建者是错误的或撒谎的(我对此表示怀疑),否则我真的无法想到任何不兼容的依赖关系。使用的数据库后端是django.db.backends.postgresql_psycopg2。还有一个worker容器,它使用与web相同的Dockerfile并用于运行celeri。Djangoworker容器的完整错误回溯如下:

worker_1 | Traceback (most recent call last):
worker_1 |   File "/usr/local/bin/celery", line 11, in <module>
worker_1 |     sys.exit(main())
worker_1 |   File "/usr/local/lib/python2.7/site-packages/celery/__main__.py", line 30, in main
worker_1 |     main()
worker_1 |   File "/usr/local/lib/python2.7/site-packages/celery/bin/celery.py", line 81, in main
worker_1 |     cmd.execute_from_commandline(argv)
worker_1 |   File "/usr/local/lib/python2.7/site-packages/celery/bin/celery.py", line 770, in execute_from_commandline
worker_1 |     super(CeleryCommand, self).execute_from_commandline(argv)))
worker_1 |   File "/usr/local/lib/python2.7/site-packages/celery/bin/base.py", line 309, in execute_from_commandline
worker_1 |     argv = self.setup_app_from_commandline(argv)
worker_1 |   File "/usr/local/lib/python2.7/site-packages/celery/bin/base.py", line 469, in setup_app_from_commandline
worker_1 |     self.app = self.find_app(app)
worker_1 |   File "/usr/local/lib/python2.7/site-packages/celery/bin/base.py", line 489, in find_app
worker_1 |     return find_app(app, symbol_by_name=self.symbol_by_name)
worker_1 |   File "/usr/local/lib/python2.7/site-packages/celery/app/utils.py", line 238, in find_app
worker_1 |     sym = imp(app)
worker_1 |   File "/usr/local/lib/python2.7/site-packages/celery/utils/imports.py", line 101, in import_from_cwd
worker_1 |     return imp(module, package=package)
worker_1 |   File "/usr/local/lib/python2.7/importlib/__init__.py", line 37, in import_module
worker_1 |     __import__(name)
worker_1 |   File "/code/my_app/tasks.py", line 3, in <module>
worker_1 |     from taskman.celery import app, DBTask
worker_1 |   File "/code/taskman/celery.py", line 6, in <module>
worker_1 |     from utils.db.clearblackbox import rm_invalid_blackbox
worker_1 |   File "/code/utils/db/clearblackbox.py", line 9, in <module>
worker_1 |     django.setup()
worker_1 |   File "/usr/local/lib/python2.7/site-packages/django/__init__.py", line 18, in setup
worker_1 |     apps.populate(settings.INSTALLED_APPS)
worker_1 |   File "/usr/local/lib/python2.7/site-packages/django/apps/registry.py", line 85, in populate
worker_1 |     app_config = AppConfig.create(entry)
worker_1 |   File "/usr/local/lib/python2.7/site-packages/django/apps/config.py", line 142, in create
worker_1 |     app_module = import_module(app_name)
worker_1 |   File "/usr/local/lib/python2.7/importlib/__init__.py", line 37, in import_module
worker_1 |     __import__(name)
worker_1 |   File "/code/utils/db/blackboxquery.py", line 2, in <module>
worker_1 |     from my_app.models import BlackBox, DataPoint, Value, SourceInfo, FormatString, Argument
worker_1 |   File "/code/my_app/models.py", line 11, in <module>
worker_1 |     class Value(models.Model):
worker_1 |   File "/usr/local/lib/python2.7/site-packages/django/db/models/base.py", line 94, in __new__
worker_1 |     app_config = apps.get_containing_app_config(module)
worker_1 |   File "/usr/local/lib/python2.7/site-packages/django/apps/registry.py", line 239, in get_containing_app_config
worker_1 |     self.check_apps_ready()
worker_1 |   File "/usr/local/lib/python2.7/site-packages/django/apps/registry.py", line 124, in check_apps_ready
worker_1 |     raise AppRegistryNotReady("Apps aren't loaded yet.")
worker_1 | django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

我见过很多类似的问题,在升级到1.9版本时也有同样的AppRegistryNotReady异常,但在我的例子中,我可以明确地告诉你,这是因为我的一个AppConfig在apps.py中的应用程序导入了模型,但建议不要这样做。安装程序上的Django文档显示:

At this stage, your code shouldn’t import any models!

In other words, your applications’ root packages and the modules that define your application configuration classes shouldn’t import any models, even indirectly.

Strictly speaking, Django allows importing models once their application configuration is loaded. However, in order to avoid needless constraints on the order of INSTALLED_APPS, it’s strongly recommended not import any models at this stage.

不幸的是,文档似乎没有提供在设置阶段导入模型的替代方法,这很遗憾,因为我实际上无法避免导入模型。具体地说,在我的celery.py中,我有一个名为DBTaskTask子类,on_error回调使用一个模块函数来删除无效的数据库插入。该模块clearblackbox.py导入模型,因为它需要对插入到数据库中的无效模型调用delete()DBTask类用作名为insertBlackboxIntoDatabaseTask的主数据库插入任务的基类。既然我无法在setup()阶段绕过导入模型,那么我还能做些什么来克服这个错误并重新运行我的服务器呢?在

编辑:我想知道我是否有任何不必要的配置,所以我删除了除两个之外的所有配置:my_app.apps.TasksConfig,其name字段指向我的tasks.py,其中包含我的数据库插入任务的定义,taskman.celery.CeleryConfig,它重写{},这样它可以自动检测INSTALLED_APPS中的任务。虽然我把taskman.celery.CeleryConfig放在INSTALLED_APPS中,但我现在得到的错误是

ImportError: No module named CeleryConfig

如果我把import djangodjango.setup()放在celery.py或{}中,试图解决由于安装过程中导入模型而发生的AppRegistryNotReady异常,就会发生这种情况。在


Tags: djangoinpyimportapplibpackagesusr
1条回答
网友
1楼 · 发布于 2024-04-26 00:33:55

最后对我有用的是删除apps.py中除了TasksConfig之外的所有配置,然后修改clearblackbox.py和{}中的导入。在clearblackbox.py中,我将模型导入移动到函数本身中,而不是将其放在顶部;在celery.py中,我将函数的导入从clearblackbox.py移动到on_failure定义中,而不是将导入放在顶部。完成此操作后,将虚线路径放到TasksConfigCeleryConfig的最后工作。在

相关问题 更多 >

    热门问题