Redis
 sql >> Database >  >> NoSQL >> Redis

Come implementare il push del server nel framework Flask?

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