Как правило, вы хотите вернуть два ответа на один запрос.Таким образом, есть две разные возможности.
Первый - запускать в фоновом режиме трудоемкую задачу и пинговать сервер с простыми ajax-запросами каждые две секунды, чтобы проверить, завершена ли задача или нет.Если задача выполнена, вернуть результат, если нет, вернуть "Please standby"
строку или что-то в этом роде.
Второй - использовать веб-сокеты и расширение flask-socketio.
Базовый код сервера будет выглядеть примерно такэто:
from threading import Thread
from flask import Flask
app = Flask(__name__)
socketio = SocketIO(app)
def do_work():
result = your_heavy_function()
socketio.emit("result", {"result": result}, namespace="/test/")
@app.route("/api/", methods=["POST"])
def start():
socketio.start_background_task(target=do_work)
# return intermediate response
return Response()
На стороне клиента вы должны сделать что-то вроде этого
var socket = io.connect('http://' + document.domain + ':' + location.port + '/test/');
socket.on('result', function(msg) {
// Process your request here
});
Для получения дополнительной информации посетите этот пост в блоге , flask-документация socketio для справки на стороне сервера и документация socketio для справки на стороне клиента.
PS Используя веб-сокеты, вы также можете сделать прогресс-бар.