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