¿Por qué mi generador impide que Flask envíe respuestas SSE?

Estoy tratando de usar Flask para atender una solicitud de SSE, pero mi cliente solo recibe los eventos después de que la función de mi generador se haya detenido / se haya cerrado la conexión.

Aquí está la reproducción más simple que he podido producir para demostrar esto:

#!/usr/bin/env python from flask import Flask, Response from time import sleep def stream(): n = 10 while n > 0: yield "data: hi\n\n" sleep(0.5) n = n - 1 app = Flask(__name__) @app.route("/events") def streamSessionEvents(): return Response( stream(), mimetype="text/event-stream" ) app.run(debug=True, threaded=True) 

Aquí está mi cliente de prueba:

     var source = new EventSource( "/events" ); source.onmessage = function(event) { console.log(event); };      

El generador de stream () producirá diez eventos y luego regresará (lo he hecho deliberadamente para demostrar el problema, lo ideal sería que el generador siguiera funcionando para siempre), momento en el que se interrumpe la conexión. La página del cliente no registra nada hasta este momento, luego escupe los diez eventos (si no tengo la variable de contador en la stream (), entonces la página nunca recibe ningún evento).

No he usado mucho Python o Flask y esto me tiene muy atascado, no puedo ver lo que estoy haciendo diferente a otros ejemplos en la red. Cualquier ayuda muy apreciada.

Dos cosas pueden interferir:

  1. Usted tiene la configuración de debug en True , que instala middleware (específicamente el depurador Werkzeug ) que puede interrumpir la transmisión.

    De la documentación de los patrones de streaming de Flask :

    Sin embargo, tenga en cuenta que algunos middlewares WSGI pueden interrumpir la transmisión, así que tenga cuidado en los entornos de depuración con perfiladores y otras cosas que pueda haber habilitado.

    Sin embargo, al usar curl o Chrome en el código de prueba con Flask 0.10.1 y Werkzeug 0.9.4, veo los data: hi respuestas de data: hi se transmiten correctamente, independientemente de la configuración del indicador de debug . En otras palabras, su código está funcionando correctamente con las versiones más recientes de la stack Flask.

  2. Las secuencias de EventSource están sujetas a límites de políticas del mismo origen . Si no está cargando la página HTML desde el mismo host y puerto, se denegará la solicitud a su servidor Flask.

    Agregar la fuente de la página de prueba en el servidor de Flask en una ruta separada funciona para mí:

     @app.route('/') def index(): return '''\         '''