asyncio 'function' 对象没有属性 'send'

asyncio 'function' object has no attribute 'send'

我正在尝试每 30 秒向客户端发送一次消息,直到客户端在 Django 通道中断开连接。下面是为使用 asyncio 实现它而编写的一段代码。但是得到错误"AttributeError: 'function' object has no attribute 'send'"。我以前没有使用过 asyncio,所以尝试了很多可能性,但都导致了某种错误(因为我没有经验)。 谁能帮我解决这个问题。

下面是代码:

class HomeConsumer(WebsocketConsumer):
    def connect(self):
        self.room_name = "home"
        self.room_group_name = self.room_name
        async_to_sync(self.channel_layer.group_add)(
            self.room_group_name,
            self.channel_name
        )
        self.accept()
        self.connected = True
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
        task = loop.create_task(self.send_response)
        loop.run_until_complete(task)

    async def send_response(self):
        while self.connected:
            sent_by = Message.objects.filter(notification_read=False).exclude(
                last_sent_by=self.scope["user"]).values("last_sent_by__username")

            self.send(text_data=json.dumps({
                'notification_by': list(sent_by)
            }))
            asyncio.sleep(30)

    
    def disconnect(self, close_code):

        async_to_sync(self.channel_layer.group_discard)(
            self.room_group_name,
            self.channel_name
        )
        self.connected = False

我认为以下部分代码可能有问题:

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
task = loop.create_task(self.send_response)
loop.run_until_complete(task)

使用 loop = asyncio.get_event_loop() 而不是创建 new_event_loop() 结果:

RuntimeError: There is no current event loop in thread 'ThreadPoolExecutor-0_0'.

我发布这个解决方案作为答案是因为我搜索了很多关于如何在 django-channels 中没有客户端请求的情况下向客户端发送数据的方法。但找不到任何完整的解释或答案。所以希望这会帮助那些处于我所处情况的人。

感谢 user4815162342 为解决我遇到的问题提供的帮助。

class HomeConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        self.room_name = "home"
        self.room_group_name = self.room_name
        await self.channel_layer.group_add(
            self.room_group_name,
            self.channel_name
        )
        await  self.accept()
        self.connected = True
        try:
            loop = asyncio.get_event_loop()
        except:
            loop = asyncio.new_event_loop()
            asyncio.set_event_loop(loop)
        loop.create_task(self.send_response())

    async def send_response(self):
        while self.connected:
            sent_by = Message.objects.filter(notification_read=False).exclude(
                last_sent_by=self.scope["user"]).values("last_sent_by__username")

            await self.send(text_data=json.dumps({
                'notification_by': list(sent_by)
            }))
            await asyncio.sleep(30)

    async def disconnect(self, close_code):

        await self.channel_layer.group_discard(
            self.room_group_name,
            self.channel_name
        )
        self.connected = False

如有任何问题或过时的用法请指正