Как реализовать отправленные сервером события в Flask framework? - PullRequest
1 голос
/ 23 апреля 2020

Я пытаюсь заставить работать индикатор выполнения в Flask. Для этого я использую отправленные сервером события . Когда я запускаю его на локальном сервере разработки, все работает хорошо, и я вижу в браузере добавленные числа в режиме реального времени в окне / progress, и индикатор выполнения работает без проблем.

Но если я запускаю его в Linux сервер (Linode), затем браузер windows зависает на 10 се c и после этого индикатор выполнения переходит на 100. Я новичок и не понимаю, почему он работает на локальной машине, а почему нет на удаленном сервере. Пожалуйста, кто-нибудь объяснит. А также - что было бы практическим решением этой проблемы.

Flask - app.py

@app.route('/progress')
def progress():
    def progress_func():
        x = 0
        while x < 100:
            time.sleep(1)
            x = x + 10
            yield 'data:' + str(x) + "\n\n"
    return Response(progress_func(), mimetype='text/event-stream')

js

var source = new EventSource("/progress");
source.onmessage = function(event) {
    $('.progress-bar').css('width', event.data+'%').attr('aria-valuenow', event.data);
    };

index. html

<div>
    <div class="progress" style="width: 100%; height: 6px;">
    <div class="progress-bar bg-success" role="progressbar" style="width: 6px" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div>
</div>

1 Ответ

1 голос
/ 23 апреля 2020

По моему опыту, эта проблема может быть вызвана обратным прокси между flask и внешним интерфейсом.

Если вы используете nginx, вам нужно установить proxy_buffering в off, чтобы возможность использовать SSE

РЕДАКТИРОВАТЬ:

Глядя на http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffering Я заметил, что вы можете достичь того же результата, установив заголовок X-Accel-Buffering на no в ответе flask. Это решение лучше, поскольку оно ограничено указанным c ответом.

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