У меня есть два flask приложения. Можно назвать его клиентским сервером (отправляет веб-страницы пользователю). Другой - это другой flask сервер, который вызывается клиентским сервером через REST API. Второй сервер делает много расчетов. Предположим, мы не можем изменить архитектуру, поскольку она уже реализована таким образом. Я хотел бы, чтобы на веб-странице был отображен индикатор выполнения, выдвигаемый клиентским сервером, в зависимости от хода вычислений, выполняемых на втором сервере. Если у меня не было другого flask сервера, я мог бы сделать это быстро с помощью Response(get_stream(), mimetype='text/event-stream')
Но так как у меня есть другой flask сервер, я не могу просто иметь Response(requests.get(url), mimetype='text/event-stream')
на клиенте, потому что он будет ждать, пока весь генератор в Второй сервер завершил работу, прежде чем получить какой-либо прогресс на клиентском сервере.
Кажется, что другой способ сделать это - через flask_socketio
, но я не могу заставить его работать.
Вот быстрый упрощенный / пример кода:
app_client.py
from flask import Flask, render_template, Response
import requests
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/result')
def result():
return render_template('done.html')
@app.route('/progress')
def progress():
url = "http://localhost:8279/progress"
return Response(requests.get(url, stream=True), mimetype='text/event-stream')
if __name__ == "__main__":
app.config['SERVER_NAME'] = 'localhost:8278'
app.run()
app_server.py
from flask import Flask, render_template, Response
import time
app = Flask(__name__)
@app.route('/progress')
def progress():
def generate():
x = 0
while x <= 100:
print("data:" + str(x))
yield "data:" + str(x) + "\n\n"
x = x + 10
time.sleep(0.5)
return Response(generate(), mimetype='text/event-stream')
if __name__ == "__main__":
app.config['SERVER_NAME'] = 'localhost:8279'
app.run()
index. html
<!DOCTYPE html>
<html>
<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<!-- <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>-->
<script>
var source = new EventSource("/progress");
source.onmessage = function(event) {
$('.progress-bar').css('width', event.data+'%').attr('aria-valuenow', event.data);
$('.progress-bar-label').text(event.data+'%');
if(event.data == 100){
source.close()
window.location.replace("http://localhost:8278/result");
}
}
</script>
</head>
<body>
<div class="progress" style="width: 50%; margin: 50px;">
<div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%">
<span class="progress-bar-label">0%</span>
</div>
</div>
</div>
</body>
</html>
готово . html
Done!!!
В основном, если я go до localhost:8278
, я бы хотел, чтобы индикатор выполнения обновлялся на основе прогресса на втором сервере.