Продолжить запрос django rest framework
У меня есть запрос, который длится более 3 минут, я хочу, чтобы запрос был отправлен и сразу выдал ответ 200, а после окончания работы - выдал результат
Предположим, пришел запрос, вам нужно будет его проверить. Затем отправить ответ и использовать механизм для завершения запроса в фоновом режиме. Вы должны быть уверены, что запрос может быть выполнен. Вы можете использовать конвейеризацию, когда вы помещаете каждую задачу в конвейер, Django-Celery является одним из вариантов, но не используйте его, если это не требуется. Найдите простой способ решения проблемы
Описанный вами рабочий процесс называется асинхронным выполнением задач.
Основная идея заключается в том, чтобы удалить из кода, обрабатывающего HTTP-запросы, части работы, требующие времени или ресурсов, и передать их какому-либо работнику. Рабочим может быть отдельный поток или процесс или даже отдельная служба, работающая на другом сервере.
Это делает ваше приложение более отзывчивым, так как пользователи получают HTTP-ответ гораздо быстрее. Кроме того, при таком подходе вы можете отображать такие удобные для пользовательского интерфейса вещи, как индикаторы выполнения и отметки о состоянии задачи, создавать политики повторного выполнения в случае неудачи задачи и т.д.
Пример рабочего процесса:
- пользователь делает HTTP запрос, инициирующий задачу
- сервер создает задачу, добавляет ее в очередь и немедленно возвращает HTTP ответ с
task_id
- front-end код запускает ajax polling для получения результатов прохождения задачи
task_id
- сервер обрабатывает опрос HTTP запросов и получает информацию о состоянии для этого
task_id
. Он возвращает информацию (результаты или "все еще ждет") с HTTP-ответом .
- на внешнем интерфейсе отображается спиннер, если сервер возвращает "все еще ожидание" или результаты, если они готовы .
Самым популярным способом сделать это в Django является использование celery распределенной очереди задач.