我正在尝试编写一个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中手动保存实例时,它似乎没有收到任何信号。
我错过了什么?
答案 0 :(得分:0)
信号不会像那样工作,我很害怕。运行服务器或shell的进程无法知道您是否在完全不同的进程中注册了侦听器。
执行此操作的正确方法是使用像Celery这样的东西:你的post_save信号会把东西放到队列中,而芹菜 - 它可能在不同的进程中运行,甚至在不同的机器上运行 - 会监听队列,拿起信息,然后运行任务。