使用 Django Channels 从 celery 后台任务向浏览器发送消息
Send a message from a celery background task to the browser with Django Channels
我在 Celery 上有一个很长的 运行 任务 运行。完成后,我想向浏览器发送一条消息,指示它刷新页面。为此,我想使用 V2 频道。
文档中不清楚如何实现。
这是我的后台任务,但我不确定如何设置消费者
@shared_task
def my_task():
time.sleep(5)
Channel('my-background-task').send({"refresh": True})
class ReloadConsumer(WebsocketConsumer):
def connect(self):
self.group_name = self.scope['user']
print(self.group_name) # use this for debugging not sure what the scope returns
# 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 reload_page(self, event):
# Send message to WebSocket
self.send(text_data=json.dumps({
'reload': True
}))
self.disconnect()
然后,当您的 celery 任务完成时,您会向相关组发送 reload_page 消息。
@shared_task
def my_task():
... do your task ...
group_name = get_user_name() # Find out way to get same as what is printed on connect()
channel_layer = get_channel_layer()
# Trigger reload message sent to group
async_to_sync(channel_layer.group_send)(
group_name,
{'type': 'reload_page'}
)
一旦您可以在用户启动 celery 任务时成功为用户创建组,然后在完成时向用户的组发送消息,就像添加此脚本一样简单:
webSocket.onmessage = function() {
window.location.reload();
}
我在 Celery 上有一个很长的 运行 任务 运行。完成后,我想向浏览器发送一条消息,指示它刷新页面。为此,我想使用 V2 频道。
文档中不清楚如何实现。
这是我的后台任务,但我不确定如何设置消费者
@shared_task
def my_task():
time.sleep(5)
Channel('my-background-task').send({"refresh": True})
class ReloadConsumer(WebsocketConsumer):
def connect(self):
self.group_name = self.scope['user']
print(self.group_name) # use this for debugging not sure what the scope returns
# 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 reload_page(self, event):
# Send message to WebSocket
self.send(text_data=json.dumps({
'reload': True
}))
self.disconnect()
然后,当您的 celery 任务完成时,您会向相关组发送 reload_page 消息。
@shared_task
def my_task():
... do your task ...
group_name = get_user_name() # Find out way to get same as what is printed on connect()
channel_layer = get_channel_layer()
# Trigger reload message sent to group
async_to_sync(channel_layer.group_send)(
group_name,
{'type': 'reload_page'}
)
一旦您可以在用户启动 celery 任务时成功为用户创建组,然后在完成时向用户的组发送消息,就像添加此脚本一样简单:
webSocket.onmessage = function() {
window.location.reload();
}