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

Hvordan implementerer man server push i Flask framework?

Tag et kig på Server-Sent Events. Server-Sent Events er en browser-API, der lader dig holde en socket åben til din server og abonnere på en strøm af opdateringer. For mere information læs Alex MacCaw (Forfatter af Juggernaut) indlæg om, hvorfor han dræber juggernaut, og hvorfor de simplere Server-Sent Events i mange tilfælde er det bedre værktøj til jobbet end Websockets.

Protokollen er virkelig nem. Tilføj blot mimetypen text/event-stream til dit svar. Browseren holder forbindelsen åben og lytter efter opdateringer. En hændelse sendt fra serveren er en tekstlinje, der starter med data: og en efterfølgende nylinje.

data: this is a simple message
<blank line>

Hvis du vil udveksle strukturerede data, skal du bare dumpe dine data som json og sende json'en over ledningen.

En fordel er, at du kan bruge SSE i Flask uden behov for en extraServer. Der er et eksempel på et simpelt chatprogram på github, som bruger redis som en 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")

Du behøver ikke bruge Gunicron for at køre eksempelappen. Bare sørg for at bruge threading, når du kører appen, for ellers vil SSE-forbindelsen blokere din udviklingsserver:

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

På klientsiden skal du blot bruge en Javascript-håndteringsfunktion, som vil blive kaldt, når en ny besked bliver pushet fra serveren.

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

Server-Sent-hændelser understøttes af nyere Firefox-, Chrome- og Safari-browsere.Internet Explorer understøtter endnu ikke Server-Sent-hændelser, men forventes at understøtte dem i version 10. Der er to anbefalede Polyfills til at understøtte ældre browsere

  • EventSource.js
  • jquery.eventsource


  1. Introduktion til Morphia – Java ODM til MongoDB

  2. MongoDB $nin Query Operator

  3. Er UNLINK-kommandoen altid bedre end DEL-kommandoen?

  4. Hvornår skal jeg bruge en NoSQL-database i stedet for en relationsdatabase? Er det okay at bruge begge på samme side?