Процесс Django выполняет задачи вместо Celery

Я запускаю приложение с Celery+redis для асинхронных задач. Мне удалось заставить Celery видеть список задач. Однако мои задачи выполняются не рабочими Celery, а процессом Django.

Я пробовал вызывать задачи с помощью .delay() и .apply_async() без успеха (фактически в этих случаях вызов задачи блокируется на неопределенное время и в логах ничего не отображается).
Возможно, я упускаю что-то очень важное, но не могу понять где.

Далее следуют соответствующие настройки:

settings.py

CELERY_REDIS_DB = os.environ.get("REDIS_DB_CELERY", 0)
CELERY_REDIS_HOST = os.getenv("REDIS_HOSTNAME", "redis")
CELERY_REDIS_PORT = 6379
CELERY_RESULT_BACKEND = BROKER_URL = (
    f'redis://{CELERY_REDIS_HOST}:{CELERY_REDIS_PORT}/{CELERY_REDIS_DB}'
)
CELERY_TIMEZONE = TIME_ZONE
CELERY_RESULT_EXPIRES = 5 * 60 * 60

celery.py

from celery import Celery

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

# Using a string here means the worker don't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()

tasks.py

@shared_task
def remove_task(
    environment=None,
    payload=None,
    **kwargs,
):
    LOGGER.info('Received task, now removing')
    ...

views.py

class MyClass(
    LoginRequiredMixin,
    PermissionRequiredMixin,
    SingleObjectMixin,
    APIView
):
    return_403 = True
    model = models.Environment
    slug_field = 'name'
    slug_url_kwarg = 'environment'

    def delete(self, request, environment):
        tasks.remove_task(environment=environment, payload=request.data)
  • Django 3.2
  • celery[redis] 5.1.2
  • redis 3.5.3
  • django-celery-results 2.0.1

Предполагая, что celery.py живет где-то, что доступно для views.py, проблема, скорее всего, в том, что поскольку вы используете общую задачу, django не знает, как общаться с брокером celery без дополнительной информации.

Для этого мы можем последовать совету наших полезных друзей из stack overflow и сделать что-то вроде следующего в вашем представлении:

from path.to.celery import app
app.set_default()
Вернуться на верх