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")
Другие вопросы по тегам