Как заставить django выполнить удаленную задачу сельдерея? Кажется, игнорирует BROKER_URL в settings.py

У меня есть приложение django, которое пытается вызвать задачу сельдерея, которая в конечном итоге будет выполняться на некоторых удаленных хостах. Кодовая база задачи полностью отделена от проекта django, поэтому я использую celery.execute.send_task и вызываю ее из сигнала модели post_delete. Код выглядит примерно так:

class MyModel(models.Model):
    @staticmethod
    def do_async_thing(sender, instance, **kwargs):
        celery.execute.send_task("tasks.do_my_thing", args=[instance.name])

signals.post_delete.connect(MyModel.do_async_thing, sender=MyModel)

Я использую последнюю версию Django (1.6.1) и celery 3.1.7, поэтому я понимаю, что мне не нужен дополнительный модуль или приложение в моем проекте django, чтобы он мог общаться с celery. Я установил BROKER_URL внутри своего settings.py как правильный URL-адрес amqp://user:password@host/vhost.

Когда этот метод срабатывает, я получаю ошибку Connection Refused. На брокере сельдерея нет указаний на то, что была предпринята попытка подключения - я думаю, он не видит конфигурацию BROKER_URL и пытается подключиться к локальному хосту.

Как мне заставить это работать? Какая дополнительная конфигурация нужна send_task, чтобы знать, где находится брокер?


person growse    schedule 22.12.2013    source источник


Ответы (1)


Итак, я нашел ответ, и это было связано с тем, что я не читал учебник (http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html) достаточно близко.

В частности, у меня был правильный celery.py, который, как я думал, должен был загрузить настройки, но я пропустил необходимые изменения в __init__.py в проекте django, который не связывал все вместе.

Мой celery.py должен быть:

from __future__ import absolute_import

import os

from celery import Celery

from django.conf import settings

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

app = Celery('mypoject')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

и __init__.py должно быть просто:

from __future__ import absolute_import

# 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
person growse    schedule 22.12.2013
comment
только один комментарий: с этой настройкой ваша команда для запуска сельдерея должна быть «celery -A myproject.celery_app worker». Мне не хватало .celery_app, и я удивляюсь, почему настройки не применялись - person Nathan Do; 14.05.2017