Django&Celery&Rabbit出现未注册错误

时间:2018-11-02 06:02:59

标签: rabbitmq celery django-celery

在此tutorial之后,我尝试首次设置Django&Celery&Rabbit。我在Windows上使用Django 2.0 Celery 4.2.0和Rabbit

我遇到错误:celery.exceptions.NotRegistered:'GeneratePDF'

我的设置如下:

在我的 init .py中:

from __future__ import absolute_import, unicode_literals
import celery
from .celery import app as celery_app

__all__ = ['celery_app']

在我的celery.py中:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'abc.settings')

app = Celery('abc')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

在我的task.py中:

from celery import shared_task
from abc.celery import app
@shared_task(name='GeneratePDF')
class GeneratePDF(View):
    def get(self, request, *args, **kwargs):
      ....

在我的views.py中:

from abc.tasks import GeneratePDF

@method_decorator(login_required, name='dispatch')
class ClientProfilePDF(RedirectView):

    def get(self, request, *args, **kwargs):
        GeneratePDF.delay(request)
        return  HttpResponseRedirect('/home/')

在我的settings.py中:

CELERY_BROKER_URL = 'amqp://localhost'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_RESULT_BACKEND = 'django-db'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Australia/Sydney'
CELERY_IMPORTS = ('abc.tasks',)

任何人都可以向我指出我要去哪里的地方以及为什么我会收到此错误的正确方向吗?任何帮助深表感谢!

1 个答案:

答案 0 :(得分:0)

两件事:

  1. 不需要任何参数来app.autodiscover_tasks(),芹菜alreayd知道如何使用settings.INSTALLED_APPS
  2. @shared_task装饰器用于生活在没有实例化应用程序的celery.py文件的应用程序中的任务。从外观上看,您的tasks.py文件与celery.py文件位于同一Django应用程序中。在这种情况下,您应该使用@app.task而不是@shared_task

开始之前,您可以通过执行celery -A myapp inspect registered获得已注册任务的列表。这样一来,您就可以查看您的GeneratePDF任务是否已注册。