2017-05-05 8 views
0

Flask-Sockets으로 실험 중입니다. 과거에 청사진에 대한 지원이 추가되었으므로 실제로 필요합니다.청사진 내에서 Python Flask-Sockets가 작동하지 않습니다.

from flask import Flask, request, abort, redirect, url_for, render_template, make_response, Response, jsonify, session 
import json 

#Importing blueprints 
from play import play, play_socket 

app = Flask(__name__) 
sockets = Sockets(app) 
app.register_blueprint(play, url_prefix=r"/play") 
sockets.register_blueprint(play_socket, url_prefix=r"/play") 

@sockets.route('/echo') 
def echo_socket(ws): 
    while not ws.closed: 
     message = ws.receive() 
     response = json.dumps({"Message":message,"Response":"Message received"}) 
     ws.send(response) 

그래서, 자바 스크립트에서 웹 소켓을 연결하고 엔드 포인트를 설정하는 '에코'(즉 var ws = new WebSocket("ws://HOST:PORT/"+"echo"))은 완벽하게 작동합니다. 나는 메시지를 보낼 수 있고 그들은 나에게 곧바로 튀게된다.

내가 청사진 play_socket에 (청사진이 기능을 이동할 때, 그것은 더 이상 작동 내가 자바 스크립트에서 '/ status_ping'에 엔드 포인트를 변경 가정하지 않습니다.

@play_socket.route('/status_ping') 
def ping(ws): 
    while not ws.closed: 
     message = ws.receive() 
     response = json.dumps({"Message":message,"Response":"Message received"}) 
     ws.send(response) 

웹 소켓은 클라이언트 측에서 성공적으로 연결하고 나는 def ping(socket):에서 간단한 print("HERE") 또는 무엇이든을 삽입하여 확인할 수 있지만, 즉시 쓸모를 렌더링, 이후 닫혀. 내가 발견

이 나는 ​​몸을 이동하는 경우 헤더 위의 while not ws.closed: 루프 복사), 그것은 작동합니다. 그러나 서버에서 클라이언트로 데이터를 푸시하는 데 소켓이 필요하므로이 방법을 사용할 수 없습니다. while 루프가 실행되면 잘못 될 것 같습니다. 어떤 이유로 소켓이 즉시 닫힙니다. while not ws.closed: ~ while True:을 변경해도 아무런 효과가 없습니다.

나는 가능한 한 문제를 격리하려고 시도했지만 더 많은 정보가 필요하면 알려 주시기 바랍니다.

편집 : 청사진

from flask import Flask, request, abort, redirect, url_for, render_template, make_response, Response, jsonify, session, current_app 
import sys 
sys.path.append('../') 
from flask_sockets import Sockets 
import json 
import time 
api_blueprint = Blueprint('api_blueprint', __name__) 

@sockets.route('/update_status') 
def echo_socket(ws): 
    message = ws.receive() 
    while not ws.closed: 
     ws.send(json.dumps({"data":message})) 
     time.sleep(1) 
    if ws.closed: 
     session.clear() 
     print("session cleared") 
sockets = Sockets(current_app) 
sockets.register_blueprint(api_blueprint, url_prefix=r"/api") 

app 컨텍스트를 사용할 수있는 주요 run.py 파일에 대한 Codesample이 시작됩니다 :

if __name__ == "__main__": 
    from gevent import pywsgi 
    from geventwebsocket.handler import WebSocketHandler 
    server = pywsgi.WSGIServer(('0.0.0.0', 15080), app, handler_class=WebSocketHandler) 
    print(server) 
    server.serve_forever() 
+0

는이 문제를 해결할 수 있었습니까? – BKC

답변

0

안녕 레나 Kloppenburg을

봅니다 넣어 sockets = Sockets(app) 전에 @play_socket.route('/status_ping') 청사진 경로.

나를 위해 다음 작품 및 I/재생/status_ping에 핑 웹 소켓 대화를 나눌 수 :

from flask import Blueprint, Flask, request, abort, redirect, url_for, render_template, make_response, Response, jsonify, session 
from flask_sockets import Sockets 
import json 

play = Blueprint('simple_page', __name__) 
play_socket = Blueprint('simple_page2', __name__) 

@play_socket.route('/status_ping') 
def ping(ws): 
    while not ws.closed: 
     message = ws.receive() 
     response = json.dumps({"Message":message,"Response":"Message received"}) 
     ws.send(response) 

app = Flask(__name__) 
sockets = Sockets(app) 
app.register_blueprint(play, url_prefix=r"/play") 
sockets.register_blueprint(play_socket, url_prefix=r"/play") 
+0

감사합니다. 모듈성을 위해 필자는 청사진을 다른 폴더 (및 파일)로 옮겨서 제대로 구조화하는 방법을 잘 모릅니다. 내가 작성한 편집을보고 조언을 모방하려고했지만 아직 작동하지 않습니다 (같은 문제). –

+0

나는 또한 똑같은 문제에 직면 해있다. 해결책을 찾아 냈는가? – user1501382