python - 从 Flask View 发送 WebSocket 消息

标签 python flask websocket gevent flask-sockets

我正在尝试制作一个使用 WebSockets 的 Flask 应用程序。 example from Flask-sockets可行,但我如何从常规 View 发送消息?

与 Flask-SocketIO 如何使用 .emit().send() 方法类似。

在下面的示例中(来自 Flask-Sockets 示例),我希望能够从 hello-view 广播消息。

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()

最佳答案

您可以使用所有客户端的全局套接字列表。遍历所有列表并向所有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()

关于python - 从 Flask View 发送 WebSocket 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47514340/

相关文章:

python - 导入错误 : cannot import name 'network' from 'tensorflow.python.keras.engine'

python - 如何在python中获取子数组?

python - jsonify Flask 中的 SQLAlchemy 结果集

reactjs - Socket.io 适用于 localhost 但不适用于 heroku 部署

java - javax.servlet.Filter 会拦截 Websocket 消息吗? (Java 服务小程序 API)

node.js - 如何声明任何客户端都可以使用 socket.io 访问的变量

python - Kivy 登录屏幕和弹出窗口出错

python - 使用分组依据并创建 CSV

python - FB Messenger 收不到消息

javascript - Python Flask 日期实时更新