sql >> データベース >  >> NoSQL >> Redis

Flaskフレームワークにサーバープッシュを実装する方法は?

    サーバー送信イベントをご覧ください。 Server-Sent Eventsは、更新のストリームをサブスクライブして、サーバーへのソケットを開いたままにしておくことができるブラウザーAPIです。詳細については、Alex MacCaw(Juggernautの作者)の投稿を読んでください。彼がjuggernautを殺す理由と、多くの場合、WebsocketsよりもsimplerServer-SentEventsの方が優れたツールです。

    プロトコルは本当に簡単です。 mimetype text/event-streamを追加するだけです あなたの応答に。ブラウザは接続を開いたままにし、更新をリッスンします。サーバーからのEventsentは、data:で始まるテキスト行です。 および次の改行。

    data: this is a simple message
    <blank line>
    

    構造化データを交換する場合は、データをjsonとしてダンプし、jsonをネットワーク経由で送信します。

    利点は、extraServerを必要とせずにFlaskでSSEを使用できることです。 githubには、redisをpub/subバックエンドとして使用する簡単なチャットアプリケーションの例があります。

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

    サンプルアプリを実行するためにgunicronを使用する必要はありません。アプリを実行するときは必ずスレッドを使用してください。そうしないと、SSE接続によって開発サーバーがブロックされます。

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

    クライアント側では、新しいメッセージがサーバーからプッシュされたときに呼び出されるJavascriptハンドラー関数が必要です。

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

    サーバー送信イベントは、最近のFirefox、Chrome、Safariブラウザでサポートされています。InternetExplorerはサーバー送信イベントをまだサポートしていませんが、バージョン10でサポートされる予定です。古いブラウザをサポートするために推奨される2つのポリフィルがあります

    • EventSource.js
    • jquery.eventsource


    1. phpMyAdminはMySQLforRedisと同等ですか?

    2. 接続ごとに新しいRedisクライアントを作成する必要がありますか?

    3. Node.js、Redis、Socket.ioを使用してツイートをキャッシュする

    4. MongoDB3.0Javaドライバーで結果をカウントする