Реализация статуса выполнения на html / js с 2 flask серверами - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть два 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, я бы хотел, чтобы индикатор выполнения обновлялся на основе прогресса на втором сервере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...