Пример сельдерея и каналов Джанго - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть приложение Django, и мне нужно сгенерировать файлы, которые могут занимать до минуты, поэтому я передаю это фоновому рабочему.

В настоящее время процесс работает следующим образом.Я отправляю на сервер, который отвечает с URL, который я могу опросить.Затем я опрашиваю сервер каждые 2 секунды и отправляю обратно «занято» или URL-адрес того, где находится файл в моем контейнере S3.

Я хочу заменить этот опрос каналами Django, но не уверен, что этолучший способ добиться этого, так как я не могу найти никаких примеров в Интернете.каналы даже предназначены для чего-то подобного?

Мои нынешние мысли таковы:

  1. Начать генерацию файла, как только клиент откроет соединение по определенному маршруту (ранееэто было бы сообщение)
  2. Фоновая задача запускается, как только клиент подключается и получает имя канала в качестве параметра
  3. Как только это сделано, он отправляет путь к файлу кПотребитель, который в свою очередь отправляет его в браузер, где я буду использовать JS для создания кнопки загрузки.

Ниже приведен пример:

@shared_task
def my_bg_task(channel_name):
    #some long running calc here
    channel_layer = get_channel_layer()
    async_to_sync(channel_layer.send)(channel_name, {'type': 'generation_done', 'f_path': 'path/to/s3/bucket'})


class ReloadConsumer(WebsocketConsumer):
    def connect(self):
        my_bg_task.delay(self.channel_name)
        self.accept()

    def generation_done(self, event):
        self.send(text_data=json.dumps({event}))

Этолучший способ добиться этого?

Очевидно, что с точки зрения безопасности он не должен быть доступен никому, кроме пользователя, открывшего соединение.

...