【发布时间】:2015-09-25 06:19:36
【问题描述】:
我正在尝试将 Django 信号的 post_save 功能与 Celery 任务结合使用。将新的 Message 对象保存到数据库后,我想评估该实例是否具有两个属性之一,如果有,则调用 'send_sms_function' 这是 Celery 注册的任务。
tasks.py
from my_project.celery import app
@app.task
def send_sms_message(message):
# Do something
signals.py
from django.db.models.signals import post_save
from django.dispatch import receiver
import rollbar
rollbar.init('234...0932', 'production')
from dispatch.models import Message
from comm.tasks import send_sms_message
@receiver(post_save, sender=Message)
def send_outgoing_messages(sender, instance, **kwargs):
if instance.some_attribute == 'A' or instance.some_attribute == 'B':
try:
send_sms_message.delay(instance)
except:
rollbar.report_exc_info()
else:
pass
我正在通过运行 Celery 工作人员在本地对此进行测试。当我在 Django shell 中并调用 Celery 函数时,它按预期工作。但是,当我将 Message 实例保存到数据库时,该函数不按预期工作:没有任何内容发布到任务队列,我没有看到任何错误消息。
我做错了什么?
【问题讨论】:
-
任务的参数中应该有可序列化的对象(int,str等),不允许有类或模型实例之类的东西;那是因为 celery 在真正运行任务之前,必须把它写成 redis 什么的,而 redis 是一个 REmote DIctionary Service,就像一个 JSON 存储;我建议在任务本身中传递 instance_id 并执行
from django.apps import get_model; Model = get_model('app.model'); instance = Model.objects.get(pk=instance_id,总是对我有用
标签: django celery django-signals celery-task