Пользователи могут не подключаться к одному и тому же сокету - django channels
Я разрабатываю функцию чата с использованием каналов django. когда сообщение отправляется, оно создается на стороне сервера и я думаю оно транслируется. в моем потребителе я добавляю и отправителя и получателя в одну группу. на стороне клиента я использую javascript для получения идентификаторов отправителя и получателя и подключения их к websocket. но когда пользователь A отправляет сообщение пользователю B. хотя объект сообщения создается и отправляется, он не появляется для пользователя B. я проверил, что оба пользователя подключены к websocket и нет никаких ошибок. но я думаю, что проблема может быть в том, что они не подключаются к одному и тому же websocket, но я не уверен, почему это происходит. также я новичок в django channels и javascript.
Javascript
Html
Потребители
class ChatConsumer(AsyncWebsocketConsumer):
async def connect(self):
self.sender_id = self.scope['url_route']['kwargs']['sender_id']
self.receiver_id = self.scope['url_route']['kwargs']['receiver_id']
self.room_group_name = f'chat_{self.sender_id}_{self.receiver_id}'
await self.channel_layer.group_add(
self.room_group_name,
self.channel_name
)
await self.accept()
async def receive(self, text_data):
text_data_json = json.loads(text_data)
message = text_data_json['message']
sender_id = text_data_json['sender_id']
receiver_id = text_data_json['receiver_id']
sender_profile_picture = await sync_to_async(self.get_profile_picture)(sender_id)
receiver_profile_picture = await sync_to_async(self.get_profile_picture)(receiver_id)
message_obj = await sync_to_async(Message.objects.create)(
sender_id=sender_id,
receiver_id=receiver_id,
content=message
)
await self.channel_layer.group_send(
self.room_group_name,
{
'type': 'chat_message',
'message': message,
'sender_id': sender_id,
'receiver_id': receiver_id,
'sender_profile_picture': sender_profile_picture,
'receiver_profile_picture': receiver_profile_picture,
'timestamp': message_obj.timestamp.strftime('%I:%M %p')
}
)
async def disconnect(self, close_code):
await self.channel_layer.group_discard(
self.room_group_name,
self.channel_name
)
async def chat_message(self, event):
message = event['message']
sender_id = event['sender_id']
receiver_id = event['receiver_id']
sender_profile_picture = event['sender_profile_picture']
receiver_profile_picture = event['receiver_profile_picture']
timestamp = event['timestamp']
await self.send(text_data=json.dumps({
'message': message,
'sender_id': sender_id,
'receiver_id': receiver_id,
'sender_profile_picture': sender_profile_picture,
'receiver_profile_picture': receiver_profile_picture,
'timestamp': timestamp
}))
def get_profile_picture(self, user_id):
return Profile.objects.get(user__id=user_id).profile_picture.url
Маршрутизация ссылок
websocket_urlpatterns = [
path('ws/messenger/<int:sender_id>/<int:receiver_id>/', ChatConsumer.as_asgi())
]