sql >> Databáze >  >> NoSQL >> Redis

Jak implementovat server push v rámci Flask?

Podívejte se na Server-Sent Events. Server-Sent Events je rozhraní API prohlížeče, které vám umožňuje ponechat otevřený soket pro váš server a přihlásit se k odběru proudu aktualizací. Pro více informací si přečtěte příspěvek Alexe MacCaw (autor Juggernauta) o tom, proč zabíjí juggernauta a proč jsou jednodušší Server-Sent Events v mnoha případech lepším nástrojem pro tuto práci než Websockets.

Protokol je opravdu jednoduchý. Stačí přidat mimetype text/event-stream na vaši odpověď. Prohlížeč bude udržovat připojení otevřené a bude naslouchat aktualizacím. Událost odeslaná ze serveru je řádek textu začínající data: a následující nový řádek.

data: this is a simple message
<blank line>

Pokud si chcete vyměňovat strukturovaná data, stačí data uložit jako json a odeslat json po drátě.

Výhodou je, že ve Flasku můžete používat SSE bez potřeby extraServeru. Na githubu je jednoduchý příklad chatovací aplikace, která používá redis jako 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")

Ke spuštění ukázkové aplikace nemusíte používat gunicron. Jen se ujistěte, že používáte vlákno při spuštění aplikace, protože jinak připojení SSE zablokuje váš vývojový server:

if __name__ == '__main__':
    app.debug = True
    app.run(threaded=True)

Na straně klienta potřebujete pouze funkci obsluhy Javascriptu, která se zavolá, když je ze serveru odeslána nová zpráva.

var source = new EventSource('/stream');
source.onmessage = function (event) {
     alert(event.data);
};

Server-Sent Events jsou podporovány nejnovějšími prohlížeči Firefox, Chrome a Safari. Internet Explorer zatím nepodporuje Server-Sent Events, ale očekává se, že je bude podporovat ve verzi 10. Existují dva doporučené Polyfilly pro podporu starších prohlížečů

  • EventSource.js
  • jquery.eventsource


  1. phpredis na fedoře 12

  2. Jak provádět operace aktualizace v GridFS (pomocí Javy)?

  3. Jak implementovat trigger pro redis datastore?

  4. Provádění dávek příkazů pomocí redis cli