Wie kann ich umleiten, wenn das vom Server gesendete Ereignis in Flask auf der Serverseite abgeschlossen ist?

Frag

Wie kann man zu einer anderen Seite umleiten, wenn das vom Server gesendete Ereignis in Flask und auf der Serverseite abgeschlossen ist?

Problembeschreibun

Eine EventSource wurde im clientseitigen Code (JavaScript) implementiert und eine Antwort wurde im serverseitigen Code (Flask, Python) zurückgegeben. Die EventSource wird geschlossen, wenn das letzte Objekt vom Server gesendet wurde. Ich kann keine eindeutige Lösung für die Weiterleitung zu einer anderen Site über den serverseitigen Code finden. Vielleicht ist die Antwort einfach, aber ich verstehe sie nicht.

Ähnliches Problem

Eine ähnliche Frage istSo stoppen Sie vom Server gesendete Ereignisse und eine mögliche Antwort im KommentarWie funktionieren vom Server gesendete Ereignisse tatsächlich?. Ich bin mir nicht sicher, ob es für PHP und Python gleich ist, also habe ich eine neue Frage dazu gestellt. Ich habe es auch nicht verstanden.

BEARBEITE Wie schließe ich eine Server-Send Events-Verbindung in Flask? ist stark mit dieser Frage verwandt. Die Frage dort ist hauptsächlich, wie man SSE von Flask stoppen kann.

Arbeitslösung auf Client-Seite

So kam ich mit einer Lösung, die funktionierte (eine Fortschrittsanzeige), aber nur auf der Client-Seite. Wie muss ich den Code ändern, um ein funktionierendes Beispiel für die erneute Verbindung über die Flask-Funktionen zu erhalten?

Relevante Code-Schnipsel

HTML / Jinja

{% block additional_stylesheets %}
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
    <link rel="stylesheet" href="{{ url_for('static', filename='data_import.css') }}" />
{%  endblock %}
{% block additional_javascripts %}
    <script src="{{ url_for('static', filename='js/data_import.js') }}"></script>
{% endblock %}
{% block content %}
    <div class="progress">
        <div class="progress-bar progress-bar-striped active"
             role="progressbar" aria-valuenow="0" aria-valuemin="0"
             aria-valuemax="100">
        </div>
    </div>
{% endblock %}

JavaScript

$(document).ready(function()
    {
        var source = new EventSource("/progress");

        source.addEventListener('import-progress', function(event)
            {
                $('.progress-bar')
                    .css('width', event.data + '%')
                    .attr('aria-valuenow', event.data);
            }, false
        );

        source.addEventListener('last-item', function()
            {
                source.close();
                redirect();
            }, false
        );
    }
);

# This works! But how to do the same thing without calling redirect()
# on client site?
function redirect()
{
    window.document.location.href = window.location.protocol + "//" +
            window.location.host + "/products.html";
}

Flasch

from foo import app
from flask import render_template, Response

@app.route('/data_import.html')
def data_import():
    return render_template(
        'data_import.html')


@app.route('/progress')
def progress():
    return Response(import_progress(), mimetype='text/event-stream')

def import_progress():
    """
    Just a small example
    """
    for number in range(1, 101):
        sse_id = str(number)
        sse_progress = str(number)
        sse_event = 'import-progress'

        if number == 100:
            sse_event = 'last-item'

        yield "id:{_id}\nevent:{event}\ndata:{progress}\n\n".format(
            _id=sse_id, event=sse_event, progress=sse_progress)

Ich habe viel versucht, um eine Weiterleitung zum Laufen zu bringen. Aber ich weiß nicht genau, wie es geht. Jeder Versuch ist bisher gescheitert.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage