【问题标题】:Django Channels 'coroutine' object is not subscriptableDjango Channels 'coroutine' 对象不可下标
【发布时间】:2020-11-26 11:53:58
【问题描述】:

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

【问题讨论】:

  • 我不确定,但也许您需要从 get_events 返回固定的行集合。试试return list(PastureEvent.objects. ...)
  • @VisioN 投射到列表返回相同的错误
  • @VisioN 打印查询集返回:

标签: python django websocket django-channels


【解决方案1】:

我一直在使用错误的类,因为我只使用 ORM 获取两个对象(不是繁重的操作)我应该使用通道通用模块中的 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]

【讨论】:

  • 好的,但是如何使用 async 我的意思是 AsyncWebsocketConsumer ??
  • @itjuba 好吧,我最终没有使用异步,但是当我了解它时,您应该将查询放入一个方法(如 get_events)中,然后使用 sync_to_async 装饰器
猜你喜欢
  • 2022-11-02
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
  • 2019-05-07
  • 2015-12-09
  • 1970-01-01
相关资源
最近更新 更多