Каналы Django получают текущий канал

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

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


person MareksNo    schedule 01.09.2020    source источник


Ответы (1)


Если вы включите channel_layers, то каждый раз, когда создается экземпляр (канал) потребителя, он автоматически создает экземпляр имени канала. Доступ к нему можно получить изнутри потребителя с помощью self.channel_name.

Изменить: channel_name полностью уникально для канала, что означает, что каждый клиент, который подключается, будет иметь уникальное имя канала, связанное с ним.

person Timothee Legros    schedule 04.09.2020
comment
Верный. Например, в моем проекте, когда пользователь открывает соединение с моим веб-приложением, открывается канал, и я передаю уникальное имя канала, которое создается длительной фоновой задаче, которая затем использует имя канала для отправки данных обратно пользователю, который сначала называется долгосрочной задачей. - person Timothee Legros; 05.09.2020
comment
Хорошо, я предполагаю, что если бы у меня было несколько каналов, я бы сохранил имя_канала в объекте сообщения, спасибо - person MareksNo; 05.09.2020
comment
Да, это был бы один из способов сделать это, если ваша цель - определить, откуда приходит каждое сообщение, с помощью channel_name. - person Timothee Legros; 05.09.2020
comment
Хм, но каждый раз, когда я обновляю страницу, имя текущего канала также меняется, поэтому я не получаю сообщения из своей базы данных. - person MareksNo; 09.09.2020
comment
Но использование имени комнаты решает эту проблему, так как это вопрос, можно ли придерживаться этого? - person MareksNo; 09.09.2020
comment
Да, вы также можете использовать имена групп, это просто зависит от вашей ситуации. Также обратите внимание, что проблему с обновлением страницы можно решить с помощью сеансов Django. - person Timothee Legros; 10.09.2020
comment
Но я думаю, что даже с сеансом, если бы я перезапустил сервер и, возможно, повторно вошел в систему, он бы исчез, не так ли? - person MareksNo; 10.09.2020
comment
Вам нужно будет сохранить информацию о сеансе или другие уникальные идентификаторы в базе данных. Допустим, пользователь регистрируется на вашем сайте, а затем вы создаете уникальный идентификатор для этого пользователя, который будет связывать любые хранимые вами данные об этом пользователе. Когда пользователь входит в чат (или другое веб-приложение), вы добавляете его канал в группу, но также сохраняете информацию о сеансе в базе данных. Когда пользователь обновляется, вы проверяете информацию о сеансе этого пользователя, чтобы увидеть, в какой группе он уже был, и снова помещаете новый канал в ту же группу. Это означает, что каждый раз, когда пользователь открывает соединение, вы проверяете базу данных. - person Timothee Legros; 11.09.2020
comment
Вот еще кое-что, что может помочь - вместо того, чтобы прерывать соединение, когда пользователь закрывает или обновляет окно, пингуйте в течение определенного времени. Это означает, что если пользователь обновляется, клиент отправит ответный запрос в течение нескольких секунд, и соединение не будет закрыто и повторно открыто. stackoverflow.com/questions/61037587/ - person Timothee Legros; 13.09.2020
comment
Хм, хорошо, помню о второй части, хотя я не уверен, как понять первый комментарий, в настоящее время у меня есть он, где пользователь является объектом в базе данных, и я назначаю пользователю ForeignKey, когда они отправляют message и сохранить имя комнаты, в которую они отправили сообщение, и когда я открываю комнату, он загружает сообщения, для которых задано имя комнаты, и загружает сообщения в сочетании с именами пользователей. Кстати, какая польза от того, чтобы не закрывать соединение и не пинговать? - person MareksNo; 13.09.2020
comment
Пинг просто поможет избежать проблем с созданием нового канала каждый раз, когда кто-то обновляет страницу. Если вы выполните эхо-запрос в течение нескольких секунд, вы можете сохранить то же соединение активным и избежать повторного извлечения данных из базы данных, тем самым уменьшив нагрузку на базу данных. У вас все в порядке, вы можете проигнорировать мой первый комментарий, но в чем проблема? Ваша программа загружает сообщения комнаты + пользователей, вы достигли того, что хотели? - person Timothee Legros; 14.09.2020
comment
Думаю, у меня проблема была с названиями каналов, которые вы мне хорошо объяснили, и я узнал от вас больше о том, как работают каналы, спасибо. - person MareksNo; 16.09.2020