尝试在 celery 任务文件中导入模型时,应用程序尚未加载

1 python django celery

在进行任何解释之前,这是我的项目的树

| projectname
|____|__init__.py
|____|celery.py
|____|settings.py
|____|urls.py
|____|wsgi.py
|app1
|app2
Run Code Online (Sandbox Code Playgroud)

这是我的芹菜.py

from celery import Celery
from celery import shared_task

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'projectname.settings')
app = Celery('projectname')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

from app1.models import *

@share_task
def tasks():
     ''' '''
Run Code Online (Sandbox Code Playgroud)

每次我尝试使用此行导入文件时,models我都会得到:celery.pyfrom app1.models import *

django.core.exceptions.AppRegistryNotReady:应用程序尚未加载。

并且本地服务器突然停止工作。 这篇文章涉及类似的问题,但不确定这里是否是这种情况。

我想要的是将一些模型导入到文件中,这样我就可以使用它们进行一些查询。

我对可能出现的问题有一点线索,但不确定。

viewsimport stuff from import stuff from就像要执行的任务尝试从 导入东西。models.py
viewscelery.py
celery.pymodels

所以那个像蛇咬自己尾巴的圆圈对我来说很奇怪。

Lem*_*eur 5

问题是当你尝试在 Django 加载配置()之前上传任务

from app1.models import *
Run Code Online (Sandbox Code Playgroud)

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'projectname.settings')
app = Celery('projectname')

app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
Run Code Online (Sandbox Code Playgroud)

当然,Celery 会检测celery.py文件中的任务,请记住,您已经导入了从celery.py到 的所有内容__init__.py,以便让 Django 在每次项目启动时加载它们(Celery 的东西,...)。

__init__.py

from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ['celery_app']
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,您要在该celery.py文件中导入模型__init.py__,也就是说,您的模型将在 Django 加载其配置之前导入,而您中的应用程序settings.py尚未构建。

您不应该将 Django 应用程序内容导入到您的__init__.py文件中,模块/应用程序是在 Django 加载配置(settings.py)之前构建的,如果您尝试像文件一样上传,这将引发错误“应用程序尚未加载”models__init__.py

根据文档,Celery 能够app.autodiscover_tasks()发现在settings.INSTALLED_APPS. 无需在“只需在所有应用程序中celery.py创建一个文件”中导入任务。tasks.py

| projectname
|____|__init__.py
|____|celery.py # contains app.autodiscover_tasks()
|____|settings.py
|____|urls.py
|____|wsgi.py
|app1
|____|tasks.py
|app2
|____|tasks.py
Run Code Online (Sandbox Code Playgroud)

任务可能在文件中起作用celery.py,但从应用程序上传模型时不起作用,请改用 app.autodiscover_tasks()

如果需要,也可以使用未来的绝对导入

from __future__ import absolute_import
Run Code Online (Sandbox Code Playgroud)