在Django渠道中创建等待队列?

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

我目前正在使用通道在Django应用程序上使用“等待队列”应用程序。我有一个使用Redis的通道层来处理组内的连接。我还在数据库中使用模型来跟踪队列中的用户数量。我的问题是,是否有一种更简单,更可扩展的方法。将来会不会有任何问题?

class ChatConsumer(AsyncWebsocketConsumer):

    @database_sync_to_async
    def get_waiting_room(self):
        return WaitingRoom.objects.all().count()

    @database_sync_to_async
    def add_to_waiting_room(self, name):
        return WaitingRoom.objects.create(name=name)

    @database_sync_to_async
    def remove_from_waiting_room(self, name):
        return WaitingRoom.objects.filter(name=name).delete()

    async def connect(self):
        self.waiting_list = 'waiting_list'

        await self.channel_layer.group_add(
            self.waiting_list, self.channel_name)

        await self.accept()

    async def receive(self, text_data):
        self.text_data = json.loads(text_data)

        await self.add_to_waiting_room(self.text_data['user'])

        users = await self.get_waiting_room()

        await self.channel_layer.group_send(self.waiting_list, {
            'type': 'user_list',
            'users': str(users)
        })

    async def disconnect(self, close_code):

        await self.remove_from_waiting_room(name=self.text_data['user'])
        await self.channel_layer.group_discard(
            self.waiting_list,
            self.channel_name)

        users = await self.get_waiting_room()

        await self.channel_layer.group_send(self.waiting_list, {
            'type': 'user_list',
            'users': str(users)
        })

    async def user_list(self, event):
        users = event['users']

        await self.send(text_data=users)

[当用户连接时,它们被添加到channel_layer(Redis)中的组中并接受连接,当我的用户单击按钮时,它将向该通道发送请求并将其添加到候诊室(我的Django模型) ,在断开连接时,它将删除Model实例,并以更新的“用户”计数向通道发送信号。

是否有更简单的方法?这种方法会造成任何障碍吗?

提前感谢。

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

浏览器并不总是干净地关闭websocket连接,所以我认为有可能永远不会触发disconnect()。因此,您可能会在数据库中获取过时的数据,或者连续两次调用.connect(),从而导致完整性错误。

© www.soinside.com 2019 - 2024. All rights reserved.