django -каналы: отслеживание пользователей в «комнатах» - PullRequest
0 голосов
/ 16 апреля 2020

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}', {}) и поддерживать этот словарь для каждого пользователя, вводящего уезжаю. Это опять-таки звучит не очень безопасно, и я не видел, чтобы кто-то использовал это, поэтому я не уверен.

Любая помощь по этому поводу будет принята с благодарностью. Я также хотел бы видеть, как существующие приложения делают это, если кто-то может указать мне на одно?

1 Ответ

0 голосов
/ 16 апреля 2020

Короче говоря, нет способа задать каналы для участников в группе, поэтому вам нужно либо:

  • записать некоторую информацию в базу данных с отметкой времени, чтобы вы могли увидеть, он устарел

или

  • отправлять сообщение каждые (n секунд) по группе каналов (машиночитаемый элемент с идентификатором пользователя), затем вашим потребителям (или веб-интерфейсу) может вести список пользователей и фильтровать его для тех, у кого есть отметка времени. Недостатком здесь является то, что может потребоваться несколько секунд, чтобы обнаружить всех пользователей в чате.

Вы не можете ничего сделать, как запись в dict или глобальный объект, так как это не распространяется на всех потребители.

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