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

时间:2018-06-03 21:15:42

标签: python django celery

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

let travelSlide = localStorage.getItem("travelSlide");
let consultationSlide = localStorage.getItem("consultationSlide");
const thumbnail = $(".thumbnail");
const travelThumbnail = $(".travel-thumbnail");
const consultationThumbnail = $(".consultation-thumbnail");
let thumbnailOffsetTop = thumbnail.offset().top - $("#main-header").height();

if ('localStorage' in window && window.localStorage !== null) {
  if (travelSlide == "travelSlide") {
    TweenMax.to(window, 1, {scrollTo:{y:thumbnailOffsetTop, ease: Power4.easeOut}, onComplete:function(){
      travelThumbnail.click();
      localStorage.removeItem("travelSlide");
    }});
  }
  if (consultationSlide == "consultationSlide") {
    TweenMax.to(window, 1, {scrollTo:{y:thumbnailOffsetTop, ease: Power4.easeOut}, onComplete:function(){
      localStorage.removeItem("consultationSlide");
      consultationThumbnail.click();
    }});
  }
}else{
  console.log('cannot use');
}

这是我的celery.py

| projectname
|____|__init__.py
|____|celery.py
|____|settings.py
|____|urls.py
|____|wsgi.py
|app1
|app2

每当我尝试使用此行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(): ''' ''' models导入celery.py文件时,我得到了:

  

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

本地服务器突然停止工作。 This post与类似问题有关,但不确定是否就是这种情况。

我想要的是将一些模型导入到文件中,因此我可以将它们用于某些查询。

我对可能出错的东西有了一点线索,但不确定。

from app1.models import * views 导入内容 models.py views 导入内容,例如要执行的任务 celery.py 尝试从 celery.py 导入内容。

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

1 个答案:

答案 0 :(得分:1)

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

from app1.models import *

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

app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

关闭课程芹菜将检测celery.py文件中的任务,记住你已经导入了从celery.py__init__.py的所有内容,让Django每次都加载它们(Celery的东西......)该项目开始了。

<强> __初始化__。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']

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

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

根据the documentation,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
  

任务可能在celery.py文件中有效,但在从应用上传模型时无效,请改用app.autodiscover_tasks()

     

如果需要,也可以使用未来的绝对进口

from __future__ import absolute_import