2014-05-05 27 views
1

我正在嘗試編寫一個Django自定義命令,該命令將用作與物理連接到服務器的硬件進行交互的守護進程。出於顯而易見的原因,我不想在我的Django視圖中運行硬件相關的命令;相反,我寧願讓視圖只與模型交互,並讓守護進程監聽模型中的Django post_save信號。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()方法被認可和預期的文本被寫入到控制檯的標準輸出。但是,在瀏覽器中與應用程序交互時或者在CLI中手動保存實例時,它似乎沒有收到任何信號。

我錯過了什麼?

回答

0

信號不會像那樣工作,恐怕。運行服務器或shell的進程無法知道您已經在完全不同的進程中註冊了偵聽器。

這樣做的正確方法是使用類似Celery的東西:您的post_save信號會將某些東西放到隊列中,而Celery--可能在不同的進程中運行,甚至在不同的機器上運行 - 會監聽隊列,拿起信息,並運行任務。