我正试图从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
运行时,将执行以下命令:
据我所知,没有一个依赖项与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
中,我有一个名为DBTask
的Task
子类,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 django
和django.setup()
放在celery.py
或{AppRegistryNotReady
异常,就会发生这种情况。在
最后对我有用的是删除}中的导入。在
apps.py
中除了TasksConfig
之外的所有配置,然后修改clearblackbox.py
和{clearblackbox.py
中,我将模型导入移动到函数本身中,而不是将其放在顶部;在celery.py
中,我将函数的导入从clearblackbox.py
移动到on_failure
定义中,而不是将导入放在顶部。完成此操作后,将虚线路径放到TasksConfig
和CeleryConfig
的最后工作。在相关问题 更多 >
编程相关推荐