Как найти, какой канал отправил определенное сообщение в Django channels + Websocket api?
Я реализую вещатель, используя каналы Django, т.е. я реализую группу каналов, где сообщение, отправленное от одного экземпляра потребителя, связанного с каналом, будет отправлено всем другим экземплярам, у которых есть их связанные каналы, зарегистрированные в этой группе.
Я использую следующий шаблон:
<!-- {% load static %} -->
<!DOCTYPE html>
<html lang="en">
<head>
<title>Messages</title>
<!-- <link href="{% static 'hello/styles.css' %}" rel="stylesheet"> -->
</head>
<body>
<textarea name="" id="chat-log" cols="100" rows="20"></textarea><br>
<input type="text" id="chat-message-input" size="100"><br>
<input type="button" value="send" id="chat-message-submit">
<script>
var ws = new WebSocket('ws://127.0.0.1:8000/ws/sc/')
ws.onopen = function(){
console.log('Websocket connection open....', event)
}
ws.onmessage = function(event){
const messageTextDom = document.getElementById('chat-log')
messageTextDom.value += JSON.parse(event['data']).msg + '\n'
console.log('Message Recieved From Serever...', event)
}
ws.onerror = function(event){
console.log('Message Error Occured...', event)
}
ws.onclose = function(event){
console.log('Webdsocket connection closed..', event)
}
document.getElementById('chat-message-submit').onclick =
function(event){
const messageInputDom = document.getElementById('chat-message-input')
const message = messageInputDom.value
ws.send(JSON.stringify({
'msg': message
}))
messageInputDom.value = ''
}
</script>
</body>
</html>
и настроил группу и утилиту отправки сообщений на бэкенде следующим образом:
from channels.generic.websocket import SyncConsumer
from asgiref.sync import async_to_sync
from channels.exceptions import StopConsumer
class TestConsumer(SyncConsumer):
def websocket_connect(self, event):
async_to_sync(self.channel_layer.group_add)('programmers', self.channel_name)
self.send({
'type': 'websocket.accept'
})
def websocket_receive(self, event):
async_to_sync(self.channel_layer.group_send)('programmers', {
'type': 'chat_message',
'message': event['text']
})
def chat_message(self, event):
self.send({
'type': 'websocket.send',
'text': event['message']
})
def websocket_disconnect(self, *args, **kwargs):
async_to_sync(self.channel_layer.group_discard)('programmers', self.channel_name)
raise StopConsumer()
Как я могу найти, какой пользователь отправил сообщение и, сравнивая на основе пользователя, который отправил сообщение, выполнить некоторое действие? Например, в WhatsApp в разговоре в представлении пользователя1 (потребительский веб-экземпляр) его сообщения отображаются справа на зеленом фоне, а в представлении пользователя2 (веб-экземпляр потребителя) его сообщения отображаются справа с зеленым фоном.