2017-05-05 9 views
0

私はFlask-Socketsを試しています。過去にBlueprintsのサポートが追加されました。本当に必要なことです。ブループリント内で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) 

ので、JavaScriptでのWebSocketを接続し、エンドポイントを設定すると、 'エコーは'(すなわちvar ws = new WebSocket("ws://HOST:PORT/"+"echo")は)完璧に動作します。私はメッセージを送ることができ、彼らは私に戻ってバウンスします。

私は青写真にこの機能を移動したいときしかし、(青写真play_socketで、それはもう動作しません、私はJavaScriptで「/ 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) 

websocketはクライアント側から正常に接続されており、これを確認するにはprint("HERE")などのものをdef ping(socket):に挿入して確認できますが、後ですぐに閉じて無駄にします。

私は、ヘッダの上のwhile not ws.closed:ループそれをコピーする)、それは '働く'。しかし、サーバーからクライアントにデータをプッシュするためにソケットが必要なので、これを使用することはできません。このwhileループが実行されると間違っているようです。ソケットは何らかの理由ですぐに閉じられます。 while not ws.closed:while True:を変更しても効果はありません。

私は可能な限り問題を切り離そうとしましたが、詳細が必要な場合は教えてください。

EDIT:青写真のための

Codesample
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ファイルは、これを起動する:

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')青写真ルート。

私のために、以下の作品と私は/演劇/ status_pingでpingのWebSocketに話すことができます。

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

ありがとうTomas。モジュール性のために、私は青写真を別のフォルダ(したがってファイル)に移動していますので、正しく構造化する方法が完全にはわかりません。私が作っている編集を見て、あなたのアドバイスを模倣しようとしましたが、それはまだ働いていません(同じ問題)。 –

+0

私も同じ問題に直面しています。ソリューションを見つけましたか? – user1501382

関連する問題