Как я могу получить список участников системы 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