微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django,将通道Websocket与信号连接

如何解决Django,将通道Websocket与信号连接

我有一个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]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。