Jetez un œil aux événements envoyés par le serveur. Server-Sent Events est une API de navigateur qui vous permet de garder ouvert un socket vers votre serveur, en vous abonnant à un flux de mises à jour. Pour plus d'informations, lisez l'article d'Alex MacCaw (auteur de Juggernaut) expliquant pourquoi il tue le mastodonte et pourquoi les événements simples envoyés par le serveur sont dans de nombreux cas le meilleur outil pour le travail que les Websockets.
Le protocole est vraiment simple. Ajoutez simplement le type mime text/event-stream
à votre réponse. Le navigateur gardera la connexion ouverte et écoutera les mises à jour. Un événement envoyé par le serveur est une ligne de texte commençant par data:
et une nouvelle ligne suivante.
data: this is a simple message
<blank line>
Si vous souhaitez échanger des données structurées, videz simplement vos données au format JSON et envoyez le JSON sur le réseau.
Un avantage est que vous pouvez utiliser SSE dans Flask sans avoir besoin d'un serveur supplémentaire. Il existe un exemple d'application de chat simple sur github qui utilise redis comme 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")
Vous n'avez pas besoin d'utiliser gunicron pour exécuter l'exemple d'application. Assurez-vous simplement d'utiliser le threading lors de l'exécution de l'application, car sinon la connexion SSE bloquera votre serveur de développement :
if __name__ == '__main__':
app.debug = True
app.run(threaded=True)
Côté client, vous avez juste besoin d'une fonction de gestionnaire Javascript qui sera appelée lorsqu'un nouveau message est poussé depuis le serveur.
var source = new EventSource('/stream');
source.onmessage = function (event) {
alert(event.data);
};
Les événements envoyés par le serveur sont pris en charge par les navigateurs Firefox, Chrome et Safari récents. Internet Explorer ne prend pas encore en charge les événements envoyés par le serveur, mais devrait les prendre en charge dans la version 10. Il existe deux polyfills recommandés pour prendre en charge les anciens navigateurs
- EventSource.js
- jquery.eventsource