Kijk eens bij Server-Sent Events. Server-Sent Events is een browser-API waarmee u een socket naar uw server kunt openen en u kunt abonneren op een stroom van updates. Lees voor meer informatie de post van Alex MacCaw (auteur van Juggernaut) waarom hij juggernaut vermoordt en waarom de eenvoudigere Server-Sent Events in veel gevallen de betere tool voor de klus zijn dan Websockets.
Het protocol is heel eenvoudig. Voeg gewoon het mimetype text/event-stream
toe op uw reactie. De browser houdt de verbinding open en luistert naar updates. Een Eventsent van de server is een regel tekst die begint met data:
en een volgende nieuwe regel.
data: this is a simple message
<blank line>
Als u gestructureerde gegevens wilt uitwisselen, dumpt u uw gegevens gewoon als json en stuurt u de json over de draad.
Een voordeel is dat je SSE in Flask kunt gebruiken zonder dat je een extra Server nodig hebt. Er is een eenvoudig voorbeeld van een chattoepassing op github die redis gebruikt als een pub/sub-backend.
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")
U hoeft gunicron niet te gebruiken om de voorbeeld-app uit te voeren. Zorg er wel voor dat u threading gebruikt wanneer u de app uitvoert, omdat anders de SSE-verbinding uw ontwikkelserver blokkeert:
if __name__ == '__main__':
app.debug = True
app.run(threaded=True)
Aan de clientzijde heb je alleen een Javascript-handlerfunctie nodig die wordt aangeroepen wanneer een nieuw bericht van de server wordt gepusht.
var source = new EventSource('/stream');
source.onmessage = function (event) {
alert(event.data);
};
Server-Sent Events worden ondersteund door recente Firefox-, Chrome- en Safari-browsers. Internet Explorer ondersteunt nog geen Server-Sent Events, maar zal deze naar verwachting in versie 10 ondersteunen. Er zijn twee aanbevolen Polyfills om oudere browsers te ondersteunen
- EventSource.js
- jquery.eventsource