TL; DR - Как вести список пользователей в каждой комнате, чтобы я мог отправлять эти данные во внешний интерфейс для отображения списка участников в этой комнате.
Я разрабатываю совместное веб-приложение, которое использует django -каналы для связи веб-сокетов между браузером и сервером. К комнате может присоединиться более одного пользователя, и каждый пользователь должен знать о каждом другом пользователе в комнате. Как мне go добиться этого, используя django -channels (v2)?
Я уже просмотрел документацию и несколько примеров проектов, доступных в Интернете, но ни один из них не добавил подобную функциональность. Я также знаю о django-channels-presence
, но проект, похоже, активно не поддерживается, поэтому я не стал изучать примеры с его использованием.
Вот что я придумал:
- Для каждой комнаты я создаю объект в базе данных, и эти объекты могут отслеживать пользователей, которые находятся в комнате. Так, например, в методе connect()
потребителя WS я мог бы сделать вызов get_or_create_room()
и room.add_participant(self.user_name)
(или извлечь это из области видимости), а в методе disconnect()
я мог бы удалить себя из комнаты. Проблема с этим, однако, заключается в том, что я могу в конечном итоге создать условия гонки? Я думаю? Кроме того, так как я выбираю объекты из ORM, я должен быть уверен, что каждый раз, перед использованием этого объекта, я должен повторно извлекать его из БД, потому что он может (и будет) быстро устаревать. Это вовсе не кажется идеальным.
- Еще один способ, которым я могу придумать, - это присоединение данных к self.channel_layer
в потребителе, где я могу сделать что-то вроде setattr(self.channel_layer, f'users_{room_id}', {})
и поддерживать этот словарь для каждого пользователя, вводящего уезжаю. Это опять-таки звучит не очень безопасно, и я не видел, чтобы кто-то использовал это, поэтому я не уверен.
Любая помощь по этому поводу будет принята с благодарностью. Я также хотел бы видеть, как существующие приложения делают это, если кто-то может указать мне на одно?