Джанго, сельдерей и кролик получают незарегистрированную ошибку - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь настроить Django & Celery & Rabbit впервые после этого урока . Я использую Django 2.0 Celery 4.2.0 и Rabbit на Windows

Я получаю сообщение об ошибке: 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))

в моих задачах.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/')

в моих настройках.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 голосов
/ 08 ноября 2018

Две быстрые вещи:

  1. Нет необходимости вводить какие-либо параметры для app.autodiscover_tasks() Сельдерей уже знает, как использовать settings.INSTALLED_APPS.
  2. Декоратор @shared_task предназначен для задач, которые существуют в приложениях, у которых нет собственного файла celery.py, в котором создается приложение. Судя по всему, ваш файл tasks.py находится в том же приложении django, что и файл celery.py. В этом случае вы должны использовать @app.task, а не @shared_task.

перед началом вы можете получить список зарегистрированных задач, выполнив celery -A myapp inspect registered. Это позволит вам увидеть, зарегистрирована ваша задача GeneratePDF или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...