1

我正在尝试编写一个 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中手动保存实例时,它似乎没有收到任何信号。

我错过了什么?

4

1 回答 1

0

恐怕信号不是那样工作的。运行服务器或 shell 的进程无法知道您已在完全不同的进程中注册了侦听器。

执行此操作的正确方法是使用 Celery 之类的东西:您的 post_save 信号会将某些内容放入队列中,而 Celery - 可能在不同的进程甚至不同的机器上运行 - 会监听队列,拿起消息,然后运行任务。

于 2014-05-05T18:41:10.987 回答