Создание очереди ожидания в Django каналах? - PullRequest
1 голос
/ 21 марта 2020

В настоящее время я работаю над приложением "очередь ожидания" в моем приложении 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) и принимает соединение, когда мой пользователь нажимает кнопку, он отправляет запрос на канал и добавляет их в комнату ожидания (модель My Django), при разъединении удаляет экземпляр модели и отправляет сигнал на канал с обновленным счетчиком «User».

Is Есть ли более простой способ сделать это? Не вызовет ли этот метод какие-либо препятствия в будущем?

Заранее спасибо.

1 Ответ

0 голосов
/ 30 марта 2020

Браузеры не всегда закрывают соединения веб-сокета чисто, поэтому я думаю, что есть вероятность, что метод connect () никогда не будет запущен. Таким образом, вы можете получить устаревшие данные в базе данных или дважды вызывать .connect (), что приведет к ошибке целостности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...