Django Channel'协程'对象不可下标

时间:2020-08-06 08:38:57

标签: python django websocket django-channels

我有一个带Django通道的WebSocket,我想在用户连接后将数据发送给使用者。

consumers.py:

class CameraOnlineConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        await self.accept()
        logger.info(f"Added {self.channel_name} channel to workflow")
        query_set = await self.get_events()
        print(query_set)
        minute_delta = timedelta(seconds=60)
        difference = query_set[0].time_stamp - query_set[1].time_stamp
        if difference <= minute_delta:
            return self.send(text_data=CameraOnline.status_code)
        else:
            return self.send(text_data=CameraOffline.status_code)

    @database_sync_to_async
    async def get_events(self):
        return PastureEvent.objects.filter(result=7).order_by('-time_stamp')[:2]

启动客户端WebSocket时:

ws = new WebSocket("ws://127.0.0.1:8000/ws/camera_online/connect/")

我在终端中打印出此错误:

    difference = query_set[0].time_stamp - query_set[1].time_stamp
TypeError: 'coroutine' object is not subscriptable
WebSocket DISCONNECT /ws/camera_online/connect/ [127.0.0.1:43014]

1 个答案:

答案 0 :(得分:0)

我一直使用错误的类,因为我只使用ORM来获取两个对象(不是繁重的操作),所以我应该使用Channels通用模块中的WebsocketConsumer。

class CameraOnlineConsumer(WebsocketConsumer):
    def connect(self):
        self.accept()
        logger.info(f"Added {self.channel_name} channel to workflow")
        query_set = self.get_events()
        minute_delta = timedelta(seconds=60)
        difference = query_set[0].time_stamp - query_set[1].time_stamp
        if difference <= minute_delta:
            return self.send(text_data=CameraOnline.default_code)
        else:
            return self.send(text_data=CameraOffline.default_code)

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