这是通过Django通道流数据的好方法吗?

问题描述 投票:0回答:1

我有一个数据库,每秒在其中插入新数据。首次建立websockets连接时,我想使用Django通道发送所有数据。然后,我希望每秒钟进入数据库的新数据数据通过同一websocket发送。我有以下消费者。py

class DataConsumer(AsyncConsumer):

    async def websocket_connect(self, event):
        print("connected", event)
        await self.send({
            "type": "websocket.accept"
        })

        obj = ... send the whole db

        await self.send({
            'type': 'websocket.send',
            'text': obj
        })

        while True:
            await asyncio.sleep(1)

            obj = ... send only new records

            await self.send({
                'type': 'websocket.send',
                'text': obj
            })

    async def websocket_receive(self, event):
        print("receive", event)

    async def websocket_disconnect(self, event):
        print("disconnected", event)

这里Django Channels - constantly send data to client from server,他们提到如果用户断开连接,循环将永远不会退出。他们提出了潜在的解决方案,但我不太了解。我该如何解决?

javascript python django django-channels
1个回答
0
投票

基本上,您要做的不是写while True:。相反,您应该定义一个全局变量,例如is_connected,在连接时将其设置为True,在断开连接时将其设置为False,并且while条件必须使用此变量,如下所示:

class DataConsumer(AsyncConsumer):

    async def websocket_connect(self, event):
        print("connected", event)
        await self.send({
            "type": "websocket.accept"
        })

        obj = ... send the whole db

        await self.send({
            'type': 'websocket.send',
            'text': obj
        })

        # here set is_connected to True 
        self.is_connected = True

        while is_connected:
            await asyncio.sleep(1)

            obj = ... send only new records

            await self.send({
                'type': 'websocket.send',
                'text': obj
            })

    async def websocket_receive(self, event):
        print("receive", event)

    async def websocket_disconnect(self, event):

        # set is_connected to false
        is_connected = False

        print("disconnected", event)
© www.soinside.com 2019 - 2024. All rights reserved.