2016-04-23 7 views
2

Ich erstelle die Web-App, die Daten verarbeiten wird, so verwende ich Server gesendet Ereignis in Flask.Sitzungsobjekt funktioniert nicht in Flask stream_with_context Funktion

Ich muss Sitzungsvariable in einer SSE-Funktion speichern, aber Kolben sieht es nicht außerhalb der Funktion. Kann ich es irgendwie reparieren?

MWE:

server.py:

from flask import Flask, render_template, session, Response, stream_with_context 
import time 

app = Flask(__name__) 
app.secret_key = b'132d2dcf59f9604c0b48e4e3a1a1cd19a0abf121b48a4777' 

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

@app.route('/progress') 
def progress(): 
    def generate(): 
     x = 0 
     while x < 100: 
      x = x + 10 
      print(x) 
      time.sleep(0.2) 
      yield "data:" + str(x) + "\n\n" 
     session['result'] = x 
     print(session['result']) #100 
    return Response(stream_with_context(generate()), mimetype= 'text/event-stream') 

@app.route('/done') 
def done(): 
    print(session['result']) #KeyError: 'result' 
    return session['result'] 

if __name__ == '__main__': 
    app.run(debug=True) 

progress.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); 
     if (event.data >=100) { 
      source.close(); 
      window.location = "http://127.0.0.1:5000/done" 
     } 
    } 
    </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%"> 
    </div> 
</div> 
</body> 
</html> 

Antwort

1

Die Sitzung ist ein Cookie. Cookies werden als Kopfzeilen gesendet. Header werden zuerst in einer Antwort gesendet, bevor der Rest des Streams gesendet wird. Sie können die Sitzung nach dem Beginn der Antwort nicht ändern. Senden Sie die Daten, die Sie benötigen, in den Stream und behandeln Sie sie auf der Empfängerseite.

+0

Ok, danke, das verstehe ich jetzt. Sollte ich das Ergebnis "x" an die JS übergeben und mit diesem Ergebnis als URL-Argument nach '/ done? Result = x' umleiten und in der' done() 'Funktion speichern? Oder gibt es einen besseren Weg? – sweetSTEAM