Как да накарам django да изпълни отдалечена задача за целина? Изглежда игнорира BROKER_URL в settings.py

Имам приложение django, което се опитва да извика celery задача, която в крайна сметка ще бъде изпълнена на някои отдалечени хостове. Кодовата база на задачите е напълно отделна от проекта 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. Няма индикация в celery broker, че е направен опит за свързване - предполагам, че не вижда конфигурацията BROKER_URL и се опитва да се свърже с localhost.

Как да накарам това да работи? Каква допълнителна конфигурация се нуждае от 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 трябва да бъде „celery -A myproject.celery_app worker“. Липсваше ми .celery_app и се чудех защо настройките не бяха приложени - person Nathan Do; 14.05.2017