使用 Channels 2.0 向 WebSocket URL 上的任何人发送关于模型保存的消息
Send message on model save to anyone at WebSocket URL using Channels 2.0
每次保存模型时,我都试图在特定 URL 向所有打开 websocket 连接的用户发送一条消息。我正在使用 Channels 社区项目 knocker 作为参考,但在这样做时我必须修改它以使用 Channels 2.0。
使用在模型的 post_save
门环上发射的信号向群组发送通知。
在 Channels 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
只好利用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
}))
每次保存模型时,我都试图在特定 URL 向所有打开 websocket 连接的用户发送一条消息。我正在使用 Channels 社区项目 knocker 作为参考,但在这样做时我必须修改它以使用 Channels 2.0。
使用在模型的 post_save
门环上发射的信号向群组发送通知。
在 Channels 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
只好利用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
}))