У меня есть приложение Django, и мне нужно сгенерировать файлы, которые могут занимать до минуты, поэтому я передаю это фоновому рабочему.
В настоящее время процесс работает следующим образом.Я отправляю на сервер, который отвечает с URL, который я могу опросить.Затем я опрашиваю сервер каждые 2 секунды и отправляю обратно «занято» или URL-адрес того, где находится файл в моем контейнере S3.
Я хочу заменить этот опрос каналами Django, но не уверен, что этолучший способ добиться этого, так как я не могу найти никаких примеров в Интернете.каналы даже предназначены для чего-то подобного?
Мои нынешние мысли таковы:
- Начать генерацию файла, как только клиент откроет соединение по определенному маршруту (ранееэто было бы сообщение)
- Фоновая задача запускается, как только клиент подключается и получает имя канала в качестве параметра
- Как только это сделано, он отправляет путь к файлу кПотребитель, который в свою очередь отправляет его в браузер, где я буду использовать 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}))
Этолучший способ добиться этого?
Очевидно, что с точки зрения безопасности он не должен быть доступен никому, кроме пользователя, открывшего соединение.