Django отправляет несколько ответов

Отказ от ответственности: новичок в Django, не знаю всех продвинутых вещей здесь, поэтому, возможно, цитирую свой вопрос в неверном ключе.

Я создал веб-сервер Django, который выполняет некоторые численные вычисления с некоторыми сетевыми данными на стороне сервера и возвращает данные клиенту. Теперь задачи, запрашиваемые пользователями, имеют несколько результатов, и они генерируются последовательно.

На данный момент то, что я делаю (1) Пользователь отправляет запрос задачи из frontend---> (2) вычисления выполняются в backend последовательно и генерируется весь результат ---> (3) django отправляет весь результат в одном ответе на frontend для обновления результата.

Теперь второй шаг, то есть расчетная часть, занимает много времени около 1-2 секунд, что портит пользовательский опыт на стороне клиента.

Поскольку несколько результатов генерируются последовательно, я могу показывать клиенту результаты один за другим по мере их генерации. Но я не могу понять, как я могу отправить несколько ответов на один запрос клиента. Я полагаю, что это невозможно в HTTP? Может ли кто-нибудь помочь мне, как мне решить эту проблему? Возможно ли это?

Вы просто не можете.

Если ответ состоит из 2 частей, где одну легко получить, а другая занимает много времени, я бы предложил вам разделить это на 2 разных вызова в FE.

Другой возможный вариант - присвоить расчету ID и вернуть немедленный ответ со ссылкой на место, где ИП может забрать результат. Затем ИП должен будет вызывать эту ссылку на получение результата в цикле до тех пор, пока расчет не завершится. В этом случае вам нужно будет хранить (по крайней мере, временно) идентификаторы запроса и результаты расчета.

Второй вариант кажется мне слишком хлопотным. Концепция рабочих очередей обычно используется, когда вам нужно запускать фоновые задачи, но это может быть излишеством для 1-2 секундных заданий (см. этот вопрос), и FE все равно придется забирать результат другим вызовом.

EDIT: Для полноты - в настоящее время существуют асинхронные двунаправленные способы коммуникации. Например, в GraphQL есть то, что называется подписками (документы здесь). Однако это ни в коем случае не готовые инструменты Django и, вероятно, потребуют больших накладных расходов.

Вернуться на верх