Я пишу бэкэнд, используя Django каналы, и мой друг, который делает Frontend, получает ошибку, когда я отправляю ему ответ, используя group_send, каждый пользователь получает столько ответов, сколько пользователей в группе.
class RoomChatConsumer(WebsocketConsumer):
def connect(self):
self.accept()
def disconnect(self, close_code):
try:
async_to_sync(self.channel_layer.group_discard)(self.room_name+'chat', self.channel_name)
except AttributeError:
pass
self.room.chat.users.remove(self.user)
message = {
"response": 'User has disconnected',
'username': self.user.username,
'timestamp': str(datetime.now().strftime("%d.%m.%y %H:%M")),
}
async_to_sync(self.channel_layer.group_send)(
self.room_name+'chat',
{
'type': 'send_users',
'data': message,
}
)
def receive(self, text_data):
text_data_json = json.loads(text_data)
if 'type' in text_data_json.keys() and text_data_json['type'] == 'authenticate':
token = text_data_json['payload']['token']
self.user = Token.objects.filter(key=token).first().user
self.room_name = self.scope['path'].split('/')[5]
self.room = Room.objects.filter(name=self.room_name).first()
async_to_sync(self.channel_layer.group_add)(self.room_name+'chat', self.channel_name)
self.users_in_room = self.room.users.all()
for msg in self.room.chat.last_messages(
self.room.chat.messages_on_connect_count
):
self.send(text_data=json.dumps({
'response': 'new message',
'message': msg.content,
'username': msg.author.username,
'timestamp': msg.timestamp.strftime("%d.%m.%y %H:%M"),
'receivers': msg.get_receivers()
}))
self.room.chat.users.add(self.user)
print(f'{self.user.username} connected')
message = {
"response": 'User is successfully connected',
'username': self.user.username,
'timestamp': str(datetime.now().strftime("%d.%m.%y %H:%M")),
}
async_to_sync(self.channel_layer.group_send)(
self.room_name+'chat',
{
'type': 'send_users',
'data': message,
}
)
elif text_data_json['request'] == 'new message':
print('new message')
recievers = []
usernames_in_room = []
for user in self.users_in_room:
usernames_in_room.append(user.username)
for part in text_data_json['message'].split():
if part[0] == '@':
if part[1:] in usernames_in_room:
user = self.users_in_room.filter(username=part[1:]).first()
if user and user != self.user:
recievers.append(user)
message = Message.objects.create(
author=self.user,
content=text_data_json['message'],
)
message.receivers.set(recievers)
message.save()
self.room.chat.messages.add(message)
message = {
'response': 'new message',
'message': message.content,
'username': message.author.username,
'timestamp': message.timestamp.strftime("%d.%m.%y %H:%M"),
'receivers': message.get_receivers(),
'current_user': self.user,
'id': message.pk
}
async_to_sync(self.channel_layer.group_send)(
self.room_name+'chat',
{
'type': 'send_users',
'data': message,
}
)
def send_users(self, event):
self.send(text_data=json.dumps(event['data']))
это потребитель, и когда JS отправляет запрос 'новое сообщение', Django возвращает сообщение всем пользователям, но каждый пользователь получает также сообщения других. Проблема на бэк-энде или на стороне Frontend?
Django версия - 3.0.2 Django версия каналов - 2.4.0 Python версия - 3.7.5