sql >> Base de Datos >  >> NoSQL >> Redis

¿Cómo implementar la inserción del servidor en Flask framework?

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, suscribiéndose a un flujo de actualizaciones. Para obtener más información, lea la publicación de Alex MacCaw (autor de Juggernaut) sobre por qué mata a Juggernaut y por qué los eventos enviados por el servidor más simples son, en muchos casos, la mejor herramienta para el trabajo que Websockets.

El protocolo es muy fácil. Simplemente agregue el tipo mime text/event-stream a tu respuesta. El navegador mantendrá la conexión abierta y escuchará las actualizaciones. Un Eventent del servidor es una línea de texto que comienza con data: y una nueva línea siguiente.

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 cable.

Una ventaja es que puede usar SSE en Flask sin necesidad de un servidor adicional. Hay un ejemplo de aplicación de chat simple en github que usa redis como backend de 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 subprocesos cuando ejecute la aplicación, porque 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 llamará 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 compatibles con los navegadores Firefox, Chrome y Safari recientes. Internet Explorer aún no es compatible con los eventos enviados por el servidor, pero se espera que los admita en la versión 10. Hay dos Polyfill recomendados para admitir navegadores más antiguos

  • Origen del evento.js
  • jquery.fuente del evento