Python 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 и установка конечной точки на "эхо" (т.е. 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)
Веб-сокет успешно подключен со стороны клиента, и я могу подтвердить это, вставив простой print("HERE")
или что-то в def ping(socket):
, но он сразу же закрывается, что делает его бесполезным.
Я узнал, что если я перемещу тело 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")
Главный 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()
1 ответ
Привет Леннарт Клоппенбург,
Попробуй поставить @play_socket.route('/status_ping')
проект маршрут до sockets = Sockets(app)
,
Следующее работает для меня, и я могу поговорить с пинговой веб-розеткой на /play/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")