Отправить сообщение о сохранении модели любому пользователю по URL-адресу WebSocket с использованием каналов 2.0

Я пытаюсь отправить сообщение всем пользователям с открытым подключением к веб-сокету по определенному URL-адресу каждый раз, когда модель сохраняется. Я использую проект сообщества каналов knocker в качестве эталона, но при этом мне нужно изменить это для работы с каналами 2.0.

Использование сигналов, подаваемых на молоток post_save модели, отправляет уведомление в группу.

В Channels 2.0 группы обрабатываются по-другому, поэтому эта строка Group('myGroup').send({'text': json.dumps(knock)}) в send_knock метод не работает. Можно ли изменить эту строку для работы с потребителем ниже?

class WeightConsumer(WebsocketConsumer):
    def connect(self):
        self.group_name = 'weight'

        # Join group
        async_to_sync(self.channel_layer.group_add)(
            self.group_name,
            self.channel_name
        )

        self.accept()

    def disconnect(self, close_code):
        # Leave group
        async_to_sync(self.channel_layer.group_discard)(
            self.group_name,
            self.channel_name
        )

    def receive(self, text_data):
        pass

person bdoubleu    schedule 13.04.2018    source источник


Ответы (1)


Просто пришлось использовать get_channel_layer()

def send_knock(self, created=False):
    """
    Send the knock in the associated channels Group
    """
    channel_layer = get_channel_layer()
    group_name = 'weight'
    weight = '%s' % self.get_knocker_weight()
    # Send message to group
    async_to_sync(channel_layer.group_send)(
        group_name,
        {
            'type': 'weight_message',
            'weight': weight
        }
    )

Затем добавьте еще один метод к потребителю.

class WeightConsumer(WebsocketConsumer):
    ...

    def receive(self, text_data):
        pass

    def weight_message(self, event):
        weight = event['weight']

        # Send message to websocket
        self.send(text_data=json.dumps({
            'weight': weight
        }))
person bdoubleu    schedule 13.04.2018