Невозможно отправить сообщение определенной группе в Django Channels
У меня есть вебсокет, который получает токен в качестве строки запроса. Затем мое пользовательское промежуточное ПО декодирует этот токен, чтобы найти имя пользователя, переданное через этот токен.
Текущий пользователь, подключающийся к вебсокету, затем подписывается на группу, названную его именем user_id
. Предположим, что пользователь UserA проходит через этот процесс сначала и подписывается на группу '1'
ПользовательВ затем подключается к вебсокету, следуя тому же процессу. На данном этапе я предполагаю, что есть две группы: одна с именем '1' и другая с именем '2'.
После того, как UserA срабатывает метод send & receive во фронтенде, у меня есть потребительская функция, которая отправляет сообщение в группу с полученным идентификатором пользователя ('2').
Однако, когда этот код выполняется, кажется, что я не отправляю сообщение ни одной группе. Я не получаю никакого сообщения об ошибке (я вижу, как сообщение, которое я хочу отправить, печатается на моем терминале).
Однако, когда я открываю два браузера, один с UserA, а другой с UserB, когда я подключаюсь к websocket и запускаю send/receive, я не вижу, что сообщение, которое я отправляю, регистрируется консолью в обоих браузерах.
Вот код для класса потребителя, обрабатывающего методы connect, send и receive:
class PracticeConsumer(AsyncConsumer):
async def websocket_connect(self, event):
username = self.scope['user']
username_id = str(await self.get_user(username))
await self.channel_layer.group_add('{}'.format(username_id), self.channel_name)
await self.send({"type": "websocket.accept", })
async def websocket_receive(self, event):
received = event["text"]
user_and_id = received.split()
username = user_and_id[0]
user_id = str(await self.get_user(username))
sleep(1)
await self.channel_layer.group_send(
'{}'.format(user_id),
{
"type": "send.message",
"message": "!!!!the websocket is sending this back!!!!",
},
)
async def websocket_disconnect(self, event):
print("disconnected", event)
async def send_message(self, event):
message = event['message']
self.send({
'message': message
})
@database_sync_to_async
def get_user(self, user_id):
try:
return User.objects.get(username=user_id).pk
except User.DoesNotExist:
return AnonymousUser()