我有一个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
需要了解哪些额外配置才能知道经纪人在哪里?
答案 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