Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将Django从1.8.6升级到1.9--Django.core.exceptions.AppRegistryNotReady:应用程序不可用';还没有装上;导入模型问题_Python_Django_Celery - Fatal编程技术网

Python 将Django从1.8.6升级到1.9--Django.core.exceptions.AppRegistryNotReady:应用程序不可用';还没有装上;导入模型问题

Python 将Django从1.8.6升级到1.9--Django.core.exceptions.AppRegistryNotReady:应用程序不可用';还没有装上;导入模型问题,python,django,celery,Python,Django,Celery,我正在尝试从Django 1.8.6升级到1.9,但是我在试图让项目正常构建和运行时遇到了麻烦。我已经更改了升级所需的许多内容,比如在my_app中创建apps.py文件,在settings.py中定义配置并在INSTALLED_apps中包含它们的点路径(以及将INSTALLED_apps更改为列表),但每次我都会遇到相同的错误: django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet. 对于一些背景信息,项目使用

我正在尝试从Django 1.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
容器使用的docker文件利用
paver
启动,以便在运行
docker compose up
时,执行以下命令:

./manage.py makemigrations --noinput
./manage.py migrate --noinput
./manage.py collectstatic --noinput
pip install --upgrade pip
pip install --upgrade -r requirements.txt
./manage.py runserver 0.0.0.0:8000
据我所知,没有一个依赖项与Django 1.9不兼容,因此我不确定这是否是问题所在。我最初认为唯一不兼容的依赖项是django_hstore,但在1.9正式发布后不久,它就进行了兼容性更新。因此,除非Djangohstore的创建者弄错了或撒谎(我对此表示怀疑),否则我真的想不出任何不兼容的依赖关系。使用的数据库后端是
django.db.backends.postgresql\u psycopg2
。还有一个
worker
容器,它使用与
web
相同的Dockerfile,用于运行芹菜。Django
worker
容器的完整错误回溯如下:

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.

如果我将
importdjango
django.setup()放入
芹菜.py
clearblackbox.py
中,试图解决由于在安装过程中导入模型而发生的
AppRegistryNotReady
异常。

最终对我有效的是除去
应用程序.py中的所有配置,除了
任务配置
,然后在
clearblackbox.py
Cellery.py
中修改导入。在
clearblackbox.py
中,我将模型导入移动到函数本身中,而不是将其保留在顶部;在
celery.py
中,我将函数的导入从
clearblackbox.py
移动到
on_failure
定义中,而不是将导入保留在顶部。完成此操作后,将虚线路径放置到
TasksConfig
CeleryConfig
的结果是有效的

我在Django 1.8.x系列中看到了一个类似的bug,这是一个回归。这意味着已安装的应用程序中的一个应用程序无法导入。您是否可以尝试从virtualenv中的Python shell导入已安装的应用程序中的每个应用程序?那可能会找到罪犯。@FlipperPA你可能误解了这里。我用的是Docker Compose,所以没有virtualenv。我已经知道哪个应用程序不可导入——它是带有我的CeleryConfig的应用程序,因为它间接导入模型。我要问的不是哪个应用程序可能是罪魁祸首,而是如何绕过我在问题中描述的导入问题。@AviahLaor在
views.py
中,我有一些上载函数,这些函数最终调用使用芹菜运行的数据库插入任务。在我的
docker compose.yml
文件中,我有一个名为
worker
的芹菜容器,该容器使用命令
bash-c“芹菜工人--app=my_app.tasks--autoreload-l DEBUG”
运行。似乎芹菜是在django安装完成之前调用的。尝试从这些视图中移动这些函数。只有在导入django之后,应用程序注册表才可用;django.setup()
已经准备好了,恐怕不行。这些上传函数需要在
views.py
中,因为它们是从使用Django REST框架的APIViews调用的。彻底重构代码以将这些上载函数从
views.py
中删除,这实际上不是一个选项。
ImportError: No module named CeleryConfig