Async в Django ListCreateApiView
У меня есть просто класс ListCreateApiView в Django, например:
class Test(ListCreateApiView):
def list(self, request, *args, **kwargs):
""" Some code which is creating excel file with openpyxl and send as response """
return excel_file
Проблема в том, что когда пользователь отправляет запрос на получение excel_файла, он должен ждать 5-10 минут, пока файл вернется. Пользователь не может перейти по другим ссылкам, пока файл не загрузится (у меня 10k+ объектов в базе данных)
Итак, как я могу добавить сюда async? Я хочу, чтобы пока файл формируется, человек мог переходить по другим ссылкам приложения.
Большое спасибо!
Django имеет некоторые проблемы с асинхронностью, и асинхронные вызовы не помогут вам в задачах, требующих больших затрат процессора, вам лучше использовать какую-нибудь распределенную очередь задач, например celery
Это позволит вам обрабатывать такие тяжелые задачи (например, генерацию excel) в другом потоке, не прерывая основной поток django. Следуйте руководству для интеграции с django.
После установки и настройки создайте задачу и запускайте ее, когда пользователь достигает конечной точки: Например:
# tasks.py
from celery import shared_task
@shared_task
def generate_excel(*args, **kwargs):
...
# views.py
from tasks import generate_excel
class Test(ListCreateApiView):
def list(self, request, *args, **kwargs):
generate_excel.delay()
return Response()