我正在試驗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()
是你能解決這個問題? – BKC