Dai un'occhiata agli eventi inviati dal server. Server-Sent Events è un'API del browser che ti consente di mantenere aperto un socket sul tuo server, iscrivendoti a un flusso di aggiornamenti. Per ulteriori informazioni, leggi il post di Alex MacCaw (autore di Juggernaut) sul motivo per cui uccide juggernaut e perché gli eventi inviati dal server più semplici sono in molti casi lo strumento migliore per il lavoro rispetto a Websockets.
Il protocollo è davvero semplice. Basta aggiungere il tipo mime text/event-stream
alla tua risposta. Il browser manterrà la connessione aperta e ascolterà gli aggiornamenti. Un Eventent dal server è una riga di testo che inizia con data:
e una nuova riga successiva.
data: this is a simple message
<blank line>
Se vuoi scambiare dati strutturati, scarica i tuoi dati come json e invia il json via cavo.
Un vantaggio è che puoi usare SSE in Flask senza la necessità di un server aggiuntivo. C'è un semplice esempio di applicazione di chat su github che usa redis come 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")
Non è necessario utilizzare gunicron per eseguire l'app di esempio. Assicurati solo di utilizzare il threading quando esegui l'app, perché altrimenti la connessione SSE bloccherà il tuo server di sviluppo:
if __name__ == '__main__':
app.debug = True
app.run(threaded=True)
Sul lato client hai solo bisogno di una funzione di gestione Javascript che verrà chiamata quando un nuovo messaggio viene inviato dal server.
var source = new EventSource('/stream');
source.onmessage = function (event) {
alert(event.data);
};
Gli eventi inviati dal server sono supportati dai recenti browser Firefox, Chrome e Safari. Internet Explorer non supporta ancora gli eventi inviati dal server, ma dovrebbe supportarli nella versione 10. Sono disponibili due Polyfill consigliati per supportare i browser meno recenti
- EventSource.js
- jquery.eventsource