【问题标题】:Django custom command doesn't seem to receive post_save signals from a running Django serverDjango 自定义命令似乎没有从正在运行的 Django 服务器接收 post_save 信号
【发布时间】:2014-06-22 03:20:42
【问题描述】:

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

我错过了什么?

【问题讨论】:

    标签: django signals models manage.py


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-07-07
      • 2015-01-25
      • 1970-01-01
      • 2019-03-17
      • 2017-04-26
      • 2016-02-15
      • 2011-08-18
      • 2012-10-12
      • 1970-01-01
      相关资源
      最近更新 更多