使用Channels 2.0将模型上的消息保存给WebSocket URL上的任何人

时间:2018-04-13 14:23:16

标签: django django-channels

每次保存模型时,我都会尝试向所有使用特定URL的开放websocket连接的用户发送消息。我正在使用Channels社区项目knocker作为参考,但在这样做时我必须修改它以使用Channels 2.0。

使用模型post_save门环上发出的信号向该组发送通知。

在频道2.0中,群组的处理方式不同,因此send_knock方法中的这一行Group('myGroup').send({'text': json.dumps(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

1 个答案:

答案 0 :(得分: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
        }))