作者:青青河边羊 | 来源:互联网 | 2023-09-05 14:54
前端用的vue,后端用的flask,有个路由需要使用websocket通信,现在是可以通信了,但后端怎么把数据实时的推给前端呢?后端在后面一直while循环推送的话,则访问其它的路由
前端用的 vue,后端用的 flask,有个路由需要使用 websocket 通信,现在是可以通信了,但后端怎么把数据实时的推给前端呢?后端在后面一直 while 循环推送的话,则访问其它的路由会失败,如果后端开多线程的话,会报 socket 死亡的问题,无法通信.
python:
1 2 3 4 5 6 7 8 9 10
| from flask_sockets import Sockets
@sockets.route('/msg')
def echo_socket(ws):
response_data = {'code': '', 'message': '', 'data': '', 'total': ''}
try:
if request.method == 'GET':
user_socker = request.environ.get('wsgi.websocket')
request_data = json.loads(user_socker.receive())
t1 = threading.Thread(target = check_status, args=(request_data, user_socker,), daemon = True)
t1.start() |
报错信息:
user_socker.send(json.dumps(response_data))
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/geventwebsocket/websocket.py", line 347, in send
raise WebSocketError(MSG_SOCKET_DEAD)
geventwebsocket.exceptions.WebSocketError: Socket is dead
vue:
initWebSocket() { //初始化 weosocket
const wsuri = 'ws://127.0.0.1:8800/msg' //ws 地址
this.websock = new WebSocket(wsuri)
this.websock.Onopen= this.websocketonopen
this.websock.Onmessage= this.websocketonmessage
this.websock.Onerror= this.websocketonerror
this.websock.Onclose= this.websocketclose
},
sockets 的异步需要 eventlet 和 gevent 的加持
另外不建议 flask 使用 sockets
换个思路 socketio 更适合 flask