2017-11-01 20 views
0

하나의 서버에서 여러 WSGI 응용 프로그램을 실행하고 해당 응용 프로그램 중 하나에서 통신하기 위해 Flask-SocketIO socketio-server를 사용하려는 설치가 있습니다.Flask socketio with werkzeug DispatcherMiddleware 및 다중 WSGI 응용 프로그램 : 연결되지 않음

나는 다음과 같은 명령을 사용하여 플라스크-SocketIO 설명서에서 제안으로 내 WSGI-애플 리케이션, eventlet와 gunicorn을 통해 봉사있어 :

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

이 애플 리케이션에게 모든 권리를 제공의 설정을위한 내부 코드는이 (__init__.py)과 같다 : 이것은 정상적으로 작동하지만, 내 응용 프로그램은 이제 더 이상 어떤 웹 소켓 연결이 없습니다

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를 처리해야하나요? 그럴 경우 어떻게 연결 문자열을 찾아야합니까? 는 지금 내 연결 문자열은 다음과 같습니다 'http://' + document.domain + ':' + location.port + '/'를 자바 스크립트 측에서

PS : 나는이 일을 해요 이유는 내가 때문에, 응용 프로그램의 나머지 부분과 동일한 도메인에서 Pyro4 게이트웨이를 제공 할 필요가 있다는 것입니다 그렇지 않으면 브라우저는 pyro4에 대한 내 REST 호출에 동일한 origin-policy 제한 사항을 적용합니다. 그래서 이것이 너무 복잡하고, 나의 최종 목표에 도달하는 쉬운 방법이 존재한다면, 나는 또한 그것에 열려 있습니다.

답변

0

나는 내 문제를 해결했지만, 슬프게도 진정한 해결책은 아니지만 해결 방법이 더 많습니다.

내 응용 프로그램을 기본 라우트에 설치하지 않은 이유는 다른 wsgi-app (pyro httpgateway)가 일부 리디렉션 자체를 수행하여 /pyro 라우트에 넣을 때 끝없이 리디렉션되도록했습니다.

이제 코드의 해당 부분을 수정하고 주 경로에 내 애플리케이션을 유지하면서 pyro 애플리케이션을 위에서 언급 한 경로에 배치했습니다 /.

위와 같이 SocketIO가 내 응용 프로그램에서 작동하도록 허용합니다. 그러나 위에서 말한 것처럼 완전한 수정보다 해결 방법이 더 많습니다.

0

Socket.IO 끝점은 기본적으로 /socket.io입니다. 앱의 첫 번째 진입 점은 DispatcherMiddleware이므로 애플리케이션에 매핑되지 않습니다.

나는 이것을 시도하지 않았지만, 접두어 /socket.io 아래에있는 디스패처 미들웨어에 앱의 중복 항목을 추가하면 Socket.IO 요청이 올바른 위치로 라우팅됩니다.

+0

답장을 보내 주셔서 감사합니다. 안타깝게도 귀하의 제안이 작동하지 않았으며, 다른 방식으로 "수정"했습니다. –