То, что вы хотите сделать, называется Web Worker Architecture
.
Чтобы передать реальное резюме queryResult
из фонового задания клиентскому приложению, вы можете использовать комбинацию очереди сообщений (рекомендуется Kafka, RabbitMQ тоже в порядке) и веб-сокета. Когда клиент отправляет запрос к конечной точке /data
, вы должны вернуть обратно некоторый уникальный токен (например, UUID, если ваш пользователь анонимный, или идентификатор пользователя, если он аутентифицирован). Тот же токен вы должны добавить к имени получившегося файла. Когда ваш фоновый работник завершил обработку файла, он использует токен (из имени файла) для создания темы Kafka или RabbitMQ, например topic_for_user_id_1337
или topic_for_uuid_jqwfoj-123qwr
, и публикует queryResult
в качестве сообщения.
В то же время ваш клиент должен установить соединение через веб-сокет (Flask довольно плохо подходит для веб-сокетов, но в любом случае для этого не так много хороших библиотек, как socketio) и передать токен через него на бэкэнд поэтому он создаст подписчика очереди сообщений, подписанного на тему с именем токена, поэтому, когда фоновое задание будет завершено, веб-сервер получит сообщение и передаст его пользователю через веб-сокет.
P.S. Если это звучит слишком сложно, вы можете избежать использования MQ и WS и поместить queryResult
в БД и создать конечную точку, чтобы проверить, существует ли она в БД. Если это не так, вы возвращаете что-то вроде not ready yet
, и клиент повторяет попытку через несколько секунд, если он готов - вы возвращаете queryResult
из БД.