Как я могу получить список участников системы log-in-ed

Я использую django и websocket.

У меня есть такой скрипт, пользователь может войти в группу websocket

Теперь я хочу вернуть список пользователей для входа в систему и вернуть список клиенту.

Как я могу это сделать?

класс пользователя чата(AsyncWebsocketConsumer):

async def connect(self):

    self.room_group_name = self.scope["url_route"]["kwargs"]["room_name"]

    logger.info("channel_name:{} / group_name {} / room_name {}".format(self.channel_name,self.room_group_name,self.scope["url_route"]["kwargs"]["room_name"]))
    await self.channel_layer.group_add(
        self.room_group_name,
        self.channel_name
    )
    await self.accept()
    await self.send(text_data=json.dumps({
        'channel_name': self.channel_name,
        'room_group_name':self.room_group_name,
        'member_list': 'how can I get the member??'
    }))

В настоящее время нет прямого способа сделать это из Django channel, я предлагаю вам, если вы работаете на производственном уровне, использовать Redis, например, для хранения данных в течение некоторого времени без влияния на производительность приложения:

Пример :

import aioredis
sync def connect(self):
    self.room_group_name = self.scope["url_route"]["kwargs"]["room_name"]
    self.redis = await aioredis.create_redis_pool('redis://localhost')
    await self.channel_layer.group_add(
        self.room_group_name,
        self.channel_name
    )
    await self.accept()
    
    # Add the channel to a Redis set
    await self.redis.sadd(self.room_group_name, self.channel_name)
    
    # Get updated member list
    members = await self.redis.smembers(self.room_group_name)
    members = list(m.decode('utf-8') for m in members)
    
    await self.send(text_data=json.dumps({
        'channel_name': self.channel_name,
        'room_group_name': self.room_group_name,
        'member_list': members
    }))

и вы должны закрыть соединение, когда оно вам не нужно

async def disconnect(self, close_code):
    await self.redis.srem(self.room_group_name, self.channel_name)
    await self.channel_layer.group_discard(
        self.room_group_name,
        self.channel_name
    )
    self.redis.close()
    await self.redis.wait_closed()

Примечание: у этого решения есть как положительные, так и отрицательные стороны, зависит от вашего случая Bad side: (Redis limitations) I really suggest to you to read more about Redis if you don't have enough knowledge about it

Вернуться на верх