我正在尝试将芹菜集成到我的Django项目中。我遵循了芹菜文档,并且可以执行一个简单的Hello World任务。但是当我尝试将我的模型导入到我的任务定义中时,我得到了AppRegisteredNotReady异常。我找到了一些关于这个例外的旧讨论,但没有最新的。我可能遗漏了一些很简单的东西。
Python 3.5, Django 1.9, Celery 3.1.23Celery.py:
from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.local') # pragma: no cover
app = Celery('autopool')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS, force=True)
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request)) # pragma: no cover
autopool/ init . py:
from __future__ import absolute_import
from autopool.celery import app as celery_app # noqa
应用程序池/tasks.py:
from __future__ import absolute_import
from celery import shared_task
@shared_task
def send_period_mail(period_id):
print("Mail sent for period " + period_id)
我用以下命令启动芹菜:
celery -A autopool worker -l info
从我的观点来看,我执行:
import .tasks send_period_mail
send_period_mail(period_id=period.id)
一切正常
然而,当我尝试向任务添加模型时:
from __future__ import absolute_import
from celery import shared_task
from .models import Period
@shared_task
def send_period_mail(period_id):
print("Mail sent for period " + period_id)
现在当我尝试启动芹菜时,我收到AppRegisteryNotReady:应用程序尚未加载异常。
全栈跟踪:http://pastebin.com/kmJZLHpT
有人知道吗?
因为当celery.py
文件被导入时,Django还没有加载应用程序/模型(所以它无法导入模型from .models import Period
),所以将导入移到函数
@shared_task
def send_period_mail(period_id):
from .models import Period
print("Mail sent for period " + period_id)
所以它只会在函数被调用时才会被加载(Django已经准备好了)
Marco的回答有效。谢谢你,马克。
我还发现我可以通过从autodiscover_tasks()
设置中删除force=True
来修复它。
将app.autodiscover_tasks(lambda: settings.INSTALLED_APPS, force=True)
更改为app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)