sql >> Databasteknik >  >> NoSQL >> Redis

Hur implementerar man server-push i Flask-ramverket?

Ta en titt på Server-Sent Events. Server-Sent Events är ett webbläsar-API som låter dig hålla en socket öppen till din server och prenumerera på en ström av uppdateringar. För mer information läs Alex MacCaw (författare av Juggernaut) inlägg om varför han dödar juggernaut och varför de enklare Server-Sent Events i många fall är det bättre verktyget för jobbet än Websockets.

Protokollet är väldigt enkelt. Lägg bara till mimetypen text/event-stream till ditt svar. Webbläsaren kommer att hålla anslutningen öppen och lyssna efter uppdateringar. En händelsesänd från servern är en textrad som börjar med data: och en efterföljande nyrad.

data: this is a simple message
<blank line>

Om du vill utbyta strukturerad data, dumpa bara din data som json och skicka json över tråden.

En fördel är att du kan använda SSE i Flask utan att behöva en extraServer. Det finns ett enkelt exempel på chattapplikationer på github som använder 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 inte använda Gunicron för att köra exempelappen. Se bara till att använda trådning när du kör appen, för annars kommer SSE-anslutningen att blockera din utvecklingsserver:

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

På klientsidan behöver du bara en Javascript-hanterarfunktion som kommer att anropas när ett nytt meddelande skickas från servern.

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

Serversända händelser stöds av de senaste webbläsarna Firefox, Chrome och Safari. Internet Explorer stöder ännu inte serverskickade händelser, men förväntas stödja dem i version 10. Det finns två rekommenderade Polyfills för att stödja äldre webbläsare

  • EventSource.js
  • jquery.eventsource


  1. Hur importerar man data från mongodb till pandor?

  2. mongodb - skapa dokument om det inte finns, annars tryck till array

  3. Hur man fångar redis.serializer.SerializationException

  4. Finns det något sätt att skriva pyspark dataframe till azure cache för redis?