vue JS получаю слишком много ответов от django каналов - PullRequest
0 голосов
/ 05 апреля 2020

Я пишу бэкэнд, используя 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...