2017-11-01 9 views
0

私は、1つのサーバーで複数のWSGIアプリケーションを実行し、それらのアプリケーションの1つで通信するためにFlask-SocketIO socketio-serverを使用する設定があります。Flask socketio with werkzeug DispatcherMiddlewareと複数のWSGIアプリケーション:no connection

次のコマンドを使用して、フラスコ-SocketIOマニュアルによって提案されたように私は私のWSGI-アプリは、eventletでgunicornを経由して提供ガット:

gunicorn --worker-class eventlet -w 1 myapp:application

これは、アプリケーションはすべての右を提供しています、セットアップのための内部コードは、この(__init__.py)のようになります。これは、それが必要として動作しますが、私のアプリケーションは、今はもう何のWebSocket接続されていない

from flask import Flask 
from werkzeug.wsgi import DispatcherMiddleware 
from Pyro4.utils.httpgateway import pyro_app as gateway 

from myapp.extensions import socketio 
from myapp.views.vue_js import vue 
from config import PYRO_REGEX 


def configure_blueprints(app): 
    app.register_blueprint(vue) 


def register_extensions(app): 
    socketio.init_app(app) 



app = Flask(__name__, instance_relative_config=True, template_folder='static', static_url_path='') 
app.config.from_object('config') 

configure_blueprints(app) 
register_extensions(app) 

# Set up WSGI application middleware to serve both the pyro httpgateway and this application 
# through the same server 
application = DispatcherMiddleware(gateway, { 
     '/app': app 
}) 

。どのようにしてFlask-SocketIOをこの設定で動作させることができますか?

問題は、/ socketioに接続しようとするとsocketioサーバーへのjavascript接続で404エラーが発生することです。

私のアプリのサブドメインをJavascript側に渡す必要がありますか? その場合、接続文字列はどのように見えますか? が今の私の接続文字列は次のようになります。Javascriptの側で'http://' + document.domain + ':' + location.port + '/'

PS: 私はこれをやっている理由は、私は以来、アプリケーションの残りの部分と同じドメインからPyro4ゲートウェイを提供する必要があるということですそれ以外の場合、ブラウザはpyro4へのREST呼び出しに同じ起点ポリシーの制限を適用します。もしこれがあまりにも複雑で、私の最終目標に到達するためのより簡単な方法があれば、私はそれにも開放しています。

答えて

0

私の問題は解決しましたが、悲しいことに、それは実際の修正ではなく、回避策のほうがあります。

私がデフォルトルートにないアプリケーションを持っていたのは、他のwsgi-app(pyro httpgateway)がリダイレクトをやっていることで、/pyroルートに無理矢理リダイレクトされました。

私はコードのその部分を修正し、主経路上にアプリケーションを保持しながら、上記のルートにpyroアプリケーションを入れました/

これは、上記のようにSocketIOが私の主なアプリケーションで動作することを可能にしますが、上記のように完全な修正よりも回避策があります。

0

Socket.IOエンドポイントは、デフォルトで/socket.ioです。アプリの最初のエントリポイントはDispatcherMiddlewareなので、アプリケーションにはマッピングされません。

これは試していませんが、/socket.ioプレフィックスのディスパッチャミドルウェアにアプリの重複エントリを追加すると、Socket.IOリクエストが適切な場所にルーティングされます。

+0

あなたの答えをありがとう、悲しいことにあなたの提案はうまくいかず、私は別の方法でそれを「固定」しました。 –

関連する問題