2017-05-05 120 views
0

我正在試驗Flask-Sockets。過去增加了對藍圖的支持,這是我真正需要的。蟒蛇燒瓶插座不能在blueprints內工作

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,它不工作了,假設我改變了端點「/ status_ping」在JavaScript:

@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已成功從客戶端連接,我可以通過在def ping(socket):中插入一個簡單的print("HERE")或其他任何內容來確認此事,但之後立即關閉,使其無效。在標題上方的while not ws.closed:循環(複製它),它'工作'。但是,我不能使用這個,因爲我需要套接字將數據從服務器推送到客戶端。這個while循環執行時似乎出錯了。由於某種原因套接字立即關閉。將while not ws.closed:更改爲while True:不起作用。

我試圖儘可能隔離問題,但請讓我知道如果您需要更多的信息。

編輯: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") 

主要run.py文件,其中app上下文可用,則開始使用此:

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')藍圖路線。

我下面的作品,我可以跟平的WebSocket上/播放/ 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

感謝Tomas。對於模塊化,我將我的藍圖移動到不同的文件夾(以及文件),所以我不完全確定如何正確構建它。看到我正在編輯的內容,我試圖模仿你的建議,但它還沒有工作(同樣的問題)。 –

+0

我也面臨同樣的問題,你找出解決方案嗎? – user1501382