如何让django执行远程芹菜任务?似乎忽略settings.py中的BROKER_URL

时间:2013-12-22 00:18:53

标签: django celery

我有一个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)和芹菜3.1.7,所以我知道我的django项目中不需要任何额外的模块或应用程序,因为它能够与芹菜交谈。我已将BROKER_URL内的settings.py设置为正确的网址amqp://user:password@host/vhost

当此方法触发时,我收到Connection Refused错误。芹菜经纪人没有任何关于尝试任何连接的迹象 - 我猜它没有看到BROKER_URL配置并且正在尝试连接到localhost。

如何使这项工作? send_task需要了解哪些额外配置才能知道经纪人在哪里?

1 个答案:

答案 0 :(得分:4)

所以我发现了答案,这与未仔细阅读教程(http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html)有关。

具体来说,我有正确的celery.py,我本以为应该加载设置,但是我错过了对django项目中__init__.py的必要更改,将所有东西连在一起。

我的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