2015-09-13 9 views
6

背景フラスコ:RESTfulなAPIとSocketIOサーバー

Iは、フラスコ、RESTfulな拡張機能を使用して単純なREST APIを作成しようとしています。このAPIは、主にシンプルなサービスのCRUDとユーザー認証を管理するために機能します。

また、Flask-SocketIO拡張機能を使用していくつかのWebソケットを作成しようとしています。これらのユーザーは、このサービスを使用している他の人に関連する一部のデータのリアルタイムアップデートを参照することができます。したがって、私はこれらのユーザーが認証され、特定のソケットに接続する権限があることを知る必要があります。

問題

しかし、私はトラブルのビットが設定さばかり抱えています。これらの2つのコンポーネント(REST APIとSocketIOサーバー)を同じFlaskインスタンスで一緒に動作させることはできないようです。理由私は、私は次のことを実行すると、REST APIまたはSocketIOサーバーのいずれかが動作しますので、これは、両方ではないと言う:

from flask import Flask 
from flask_restful import Api 
from flask.ext.socketio import SocketIO 

app = Flask(__name__) 

api = Api(app) 
socketio = SocketIO(app) 

# some test resources for the API and 
# a test emitter statement for the SocketIO server 
# are added here 

if __name__ == '__main__': 
    app.run(port=5000) 
    socketio.run(app, port=5005) 

質問

は、このタイプの典型的なソリューションです。 Flaskの2つの異なるインスタンスが同時に実行されるようにセットアップしますか?例えば、私のSocketIOサーバーは、特定のユーザーが特定のソケットに接続するために認証されているかどうかを確認するために、REST APIに要求を出す必要がありますか?

+0

あなただけ*場合* 'socketio.run(アプリ、ポート= 5005)'を使用し、ポート5005上のREST APIをヒットしよう?どうなりますか正常に動作し、いくつかの理由から、 –

+0

@SeanVieira ...私はちょうど同じポートで、その後 – nmagerko

答えて

11

は、あなただけのsocketio.run(app, port=5005)を実行したいとポート5005フードの下、フラスコ-SocketIOがgeventに基づいてイベント化ウェブサーバを実行しているので、この作品の理由がある

(または1.0リリースでREST APIを打ちます、also eventlet) - このサーバはWebSocket要求を直接処理します(socketio.onデコレータを使用して登録したハンドラを使用します)。そして、WebSocket以外のリクエストをFlaskに渡します。 app.runsocketio.run両方がの操作をブロックしあるので、あなたのコード働いていなかった

理由があります。どちらが最初に走ったかは、ループを起こして接続を待っていました。実際にが必要な場合は、別のポートでwebsocket接続を実行するには、socketioまたはappを別のプロセスで呼び出す必要があります。

+4

グレート答えを私のAPIとソケットをおこうとしたが、私はフラスコ-SocketIOが上の排他的依存関係を破るしようとしていることに注意したいですジーヴェント。開発リリース1.0a1の拡張機能は、gevent、eventlet、さらにはWerkzeugを使用することができます(後者はWebSocketサポートなしで実行されます)。 – Miguel

+0

ベストアンサー。 – piyush121

関連する問題