Отправить сообщение WebSocket из представления Flask

Я пытаюсь создать приложение Flask, которое использует WebSockets. Пример с Flask-сокетами работает, но как мне отправить сообщение из обычного представления?

Аналогично тому, как используют Flask-SocketIO .emit() а также .send()-методы.

В приведенном ниже примере (из примера Flask-Sockets) я хотел бы, например, иметь возможность транслировать сообщение от hello-Посмотреть.

from flask import Flask
from flask_sockets import Sockets


app = Flask(__name__)
sockets = Sockets(app)


@sockets.route('/echo')
def echo_socket(ws):
    while not ws.closed:
        message = ws.receive()
        ws.send(message)


@app.route('/')
def hello():
    # How can I send a WebSocket message from here?
    return 'Hello World!'


if __name__ == "__main__":
    from gevent import pywsgi
    from geventwebsocket.handler import WebSocketHandler
    server = pywsgi.WSGIServer(('', 5000), app, handler_class=WebSocketHandler)
    server.serve_forever()

1 ответ

Решение

Вы можете использовать глобальный список сокетов всех клиентов. Пройдите по всему списку и отправьте сообщение всем экземплярам ws.

Пример кода;

from flask import Flask, render_template
from flask_sockets import Sockets


app = Flask(__name__)
sockets = Sockets(app)

ws_list = []

@sockets.route('/echo')
def echo_socket(ws):
    ws_list.append(ws)
    while not ws.closed:
        message = ws.receive()
        ws.send(message)


@app.route('/')
def hello():
    # How can I send a WebSocket message from here?
    return render_template('index.html')


@app.route('/send_message_to_all_client')
def broadcast():

    for ws in ws_list:
        if not ws.closed:
            ws.send("broadcast message")
        else:
            # Remove ws if connection closed.
            ws_list.remove(ws)

    return "ok"

if __name__ == "__main__":
    from gevent import pywsgi
    from geventwebsocket.handler import WebSocketHandler
    server = pywsgi.WSGIServer(('', 5000), app, handler_class=WebSocketHandler)
    server.serve_forever()
Другие вопросы по тегам