Django自定义命令似乎没有从正在运行的Django服务器接收post_save信号

时间:2014-05-05 18:12:12

标签: django signals models manage.py

我正在尝试编写一个Django自定义命令,该命令将用作与物理连接到服务器的硬件进行交互的守护进程。出于显而易见的原因,我不想在我的Django视图中运行与硬件相关的命令;相反,我宁愿让视图只与模型交互,让守护进程从模型中侦听Django post_save信号。

为了测试,我有这个自定义命令:

from django.core.management.base import BaseCommand
from django.core.management.base import CommandError

from thermostat.models import Relay
from thermostat.models import Sensor
from thermostat.models import Thermostat

from django.db.models.signals import post_save

import time


class Command(BaseCommand):
  def handle(self, *args, **options):
    post_save.connect(self.saved)

    t = Thermostat.objects.get()
    t.save()

    time.sleep(30)

  def saved(self, sender, **kwargs):
    self.stdout.write(str(sender))
    self.stdout.write(str(kwargs))

识别第一个.save()方法,并将预期的文本写入控制台的标准输出。但是,在浏览器中与应用程序交互时或在./manage.py shell CLI中手动保存实例时,它似乎没有收到任何信号。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

信号不会像那样工作,我很害怕。运行服务器或shell的进程无法知道您是否在完全不同的进程中注册了侦听器。

执行此操作的正确方法是使用像Celery这样的东西:你的post_save信号会把东西放到队列中,而芹菜 - 它可能在不同的进程中运行,甚至在不同的机器上运行 - 会监听队列,拿起信息,然后运行任务。