tutorial examples example español application app python redis flask juggernaut

español - python web examples



¿Cómo implementar el servidor push en Flask framework? (2)

Estoy intentando construir un sitio pequeño con la funcionalidad de inserción del servidor en el marco de Flask micro-web, pero no sabía si había un marco con el que trabajar directamente.

redis-py Juggernaut , pero parece que no funciona con redis-py en la versión actual, y Juggernaut ha quedado obsoleto recientemente.

¿Alguien tiene una sugerencia con mi caso?


Como seguimiento de la respuesta de @ peter-hoffmann , escribí una extensión de Flask específicamente para manejar eventos enviados por el servidor. Se llama Flask-SSE , y está disponible en PyPI . Para instalarlo, ejecuta:

$ pip install flask-sse

Puedes usarlo así:

from flask import Flask from flask_sse import sse app = Flask(__name__) app.config["REDIS_URL"] = "redis://localhost" app.register_blueprint(sse, url_prefix=''/stream'') @app.route(''/send'') def send_message(): sse.publish({"message": "Hello!"}, type=''greeting'') return "Message sent!"

Y para conectarse a la secuencia de eventos desde Javascript, funciona así:

var source = new EventSource("{{ url_for(''sse.stream'') }}"); source.addEventListener(''greeting'', function(event) { var data = JSON.parse(event.data); // do what you want with this data }, false);

La documentación está disponible en ReadTheDocs. Tenga en cuenta que necesitará un servidor Redis ejecución para gestionar pub / sub.


Eche un vistazo a los eventos enviados por el servidor . Server-Sent Events es una API de navegador que le permite mantener abierto un socket en su servidor y suscribirse a una secuencia de actualizaciones. Para obtener más información, lea la publicación de Alex MacCaw (autor de Juggernaut) sobre por qué mata a los monstruos y por qué los eventos sencillos enviados por el servidor son en sí mismos la mejor herramienta para el trabajo que Websockets.

El protocolo es realmente fácil. Simplemente agregue el text/event-stream mimet text/event-stream a su respuesta. El navegador mantendrá la conexión abierta y escuchará las actualizaciones. Un evento enviado desde el servidor es una línea de texto que comienza con data: y una siguiente línea nueva.

data: this is a simple message <blank line>

Si desea intercambiar datos estructurados, simplemente descargue sus datos como json y envíe el json por el cable.

Una ventaja es que puede usar SSE en Flask sin la necesidad de un Servidor adicional. Hay un ejemplo simple de la aplicación de chat en github que usa redis como un backend pub / sub.

def event_stream(): pubsub = red.pubsub() pubsub.subscribe(''chat'') for message in pubsub.listen(): print message yield ''data: %s/n/n'' % message[''data''] @app.route(''/post'', methods=[''POST'']) def post(): message = flask.request.form[''message''] user = flask.session.get(''user'', ''anonymous'') now = datetime.datetime.now().replace(microsecond=0).time() red.publish(''chat'', u''[%s] %s: %s'' % (now.isoformat(), user, message)) @app.route(''/stream'') def stream(): return flask.Response(event_stream(), mimetype="text/event-stream")

No necesita usar gunicron para ejecutar la aplicación de ejemplo. Solo asegúrese de usar el subprocesamiento al ejecutar la aplicación, ya que de lo contrario la conexión SSE bloqueará su servidor de desarrollo:

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

En el lado del cliente solo necesita una función de controlador de Javascript que se ejecutará cuando se envíe un nuevo mensaje desde el servidor.

var source = new EventSource(''/stream''); source.onmessage = function (event) { alert(event.data); };

Los eventos enviados por el servidor son supported con los navegadores recientes de Firefox, Chrome y Safari. Internet Explorer aún no admite eventos enviados por el servidor, pero se espera que los admita en la Versión 10. Hay dos Polyfills recomendados para admitir navegadores antiguos.