Django,将通道Websocket与信号连接

时间:2020-08-18 11:15:29

标签: python django django-channels django-signals

我有一个Channels Web套接字,我试图添加另一个应用程序的信号,因此当创建事件时,WebSocket会根据其逻辑发送一条消息。 当我第一次连接WebSocket时,该功能可以正常运行,当我添加发送者模型的新对象时,会出现错误。

消费者:

class CameraOnlineConsumer(JsonWebsocketConsumer):
    def connect(self):
        self.accept()
        return self.send(json.dumps({"type": "websocket.accept",
                                     "send": "Connected Successfully"})), self.camera()

    def camera(self):
        result = self.check_events()
        print("new event")
        return self.send(json.dumps({
            "type": "websocket.send",
            "send": result
        }))

    def get_events(self):
        return PastureEvent.objects.filter(result=8, farm_id='1', processed=False).order_by('-time_stamp')[:2]

    def check_events(self):
        minute_delta = timedelta(seconds=60)
        query_set = self.get_events()
        if not query_set:
            result = {'camera status': CameraOffline.default_detail, }
            return result
        elif len(query_set) == 1:  # means that no new events has been recorded since last check.
            result = {'camera status': CameraOnline.default_detail,
                      'first time_stamp': str(query_set[0].time_stamp)}
            return result
        elif len(query_set) >= 2:  # two relevant events received.
            difference = query_set[0].time_stamp - query_set[1].time_stamp
            if difference <= minute_delta:
                if query_set[1]:
                    # query_set[1].processed = True & query_set[1].save() didn't work, why?
                    PastureEvent.objects.select_for_update().filter(id=query_set[1].id).update(processed=True)
                else:
                    pass
                # time difference between them is under/equal to the desired time difference between events.
                result = {'camera status': CameraOnline.default_detail,
                          'first time_stamp': str(query_set[0].time_stamp),
                          'last time_stamp': str(query_set[1].time_stamp)}
                return result
            else:
                if query_set[1]:
                    PastureEvent.objects.select_for_update().filter(id=query_set[1].id).update(processed=True)
                else:
                    pass
                # two events exist but the difference between them is bigger then one minute, if changed in the next
                # check it would be updated to camera online.
                result = {'camera status': CameraOnline.default_detail,
                          'first time_stamp': str(query_set[0].time_stamp)}
                return result
        else:
            # For now, every other case should result in a camera offline msg as well.
            return {'camera status': CameraOffline.default_detail}

apps.py中我的信号定义:

class AgsenzeApiConfig(AppConfig):
    name = 'agsenze_api'

    def ready(self):
        from agsenze_api.models import PastureEvent
        from farm_api.consumers import CameraOnlineConsumer
        post_save.connect(CameraOnlineConsumer.camera, sender=PastureEvent)

创建新对象时:

    (receiver, receiver(signal=self, sender=sender, **named))
TypeError: camera() got an unexpected keyword argument 'signal'
HTTP POST /agsenze_admin/agsenze_api/pastureevent/add/ 500 [0.04, 127.0.0.1:36304]

0 个答案:

没有答案