Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Wie implementiert man Server-Push im Flask-Framework?

Sehen Sie sich Server-Sent Events an. Server-Sent Events ist eine Browser-API, mit der Sie einen Socket zu Ihrem Server offen halten und einen Strom von Updates abonnieren können. Für weitere Informationen lesen Sie den Beitrag von Alex MacCaw (Autor von Juggernaut) darüber, warum er Juggernaut tötet und warum die einfacheren vom Server gesendeten Ereignisse in vielen Fällen das bessere Werkzeug für den Job sind als Websockets.

Das Protokoll ist wirklich einfach. Fügen Sie einfach den Mimetyp text/event-stream hinzu zu deiner Antwort. Der Browser hält die Verbindung offen und wartet auf Updates. Ein vom Server gesendetes Ereignis ist eine Textzeile, die mit data: beginnt und einem folgenden Zeilenumbruch.

data: this is a simple message
<blank line>

Wenn Sie strukturierte Daten austauschen möchten, sichern Sie Ihre Daten einfach als json und senden Sie den json über das Kabel.

Ein Vorteil ist, dass Sie SSE in Flask verwenden können, ohne dass ein extra Server erforderlich ist. Es gibt ein einfaches Chat-Anwendungsbeispiel auf GitHub, das Redis als Pub/Sub-Backend verwendet.

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")

Sie müssen gunicron nicht verwenden, um die Beispiel-App auszuführen. Stellen Sie nur sicher, dass Sie Threading verwenden, wenn Sie die App ausführen, da die SSE-Verbindung sonst Ihren Entwicklungsserver blockiert:

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

Auf der Client-Seite brauchen Sie nur eine Javascript-Handler-Funktion, die aufgerufen wird, wenn eine neue Nachricht vom Server gepusht wird.

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

Vom Server gesendete Ereignisse werden von aktuellen Firefox-, Chrome- und Safari-Browsern unterstützt. Internet Explorer unterstützt vom Server gesendete Ereignisse noch nicht, wird sie aber voraussichtlich in Version 10 unterstützen. Es gibt zwei empfohlene Polyfills zur Unterstützung älterer Browser

  • EventSource.js
  • jquery.eventsource