Отправить сообщение из фонового задания сельдерея в браузер с каналами Django - PullRequest
0 голосов
/ 13 мая 2018

У меня долгая задача на Celery. Когда это будет сделано, я хочу отправить сообщение в браузер, который просто проинструктирует его обновить страницу. Для этого я хочу использовать каналы V2.

Из документов не ясно, как этого добиться.

Это то, что у меня есть в моей фоновой задаче, но я не уверен, как настроить Потребителя

@shared_task
def my_task():
    time.sleep(5)
    Channel('my-background-task').send({"refresh": True})

1 Ответ

0 голосов
/ 14 мая 2018
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()

Затем, когда ваше задание по сельдерею завершено, вы отправляете сообщение 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'}
    )

Как только вы можете успешно создать группу для пользователя, когда он запускает задачу сельдерея, а затем отправить сообщение группе пользователей по завершении, это так же просто, как добавить этот скрипт:

webSocket.onmessage = function() {
    window.location.reload();
}
...