You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Flask-SocketIO开发聊天应用WebSocket无法升级问题求助

问题修复方案

核心原因

Flask-SocketIO默认未显式指定异步模式时,会优先使用开发环境的同步服务,即使安装了eventlet/gevent也不会自动加载WebSocket支持,因此连接会降级为轮询(polling)模式。可按照以下步骤修复:


1. 服务端显式指定异步模式

推荐优先使用eventlet,兼容性更好,无需额外安装其他附属依赖。修改SocketIO初始化代码即可:

from flask import Flask, render_template
from flask_socketio import SocketIO

app = Flask(__name__) 
app.config['SECRET_KEY'] = 'test'
# 新增async_mode参数指定异步模式,也可替换为'gevent'
socketio = SocketIO(app, async_mode='eventlet')

@app.route('/')
def main():
    return render_template('chat.html')

@socketio.on('message')
def message_func(data):
    socketio.send(data)

if __name__ == '__main__':
    socketio.run(app)

如果选择使用gevent作为异步模式,需要额外安装gevent-websocket依赖:pip install gevent-websocket


2. 调整服务启动逻辑

  • 本地开发时,直接执行python 你的启动文件名.py即可,框架会自动加载eventlet的WebSocket支持
  • 生产环境用gunicorn部署时,执行以下启动命令,指定eventlet worker类:
    gunicorn --worker-class eventlet -w 1 你的启动文件名:app
    

注意:单进程部署SocketIO应用时worker数量必须为1,多进程场景需要额外配置Redis等消息中间件实现跨进程消息广播,小型聊天应用无需开启多进程


3. 客户端指定传输优先级

客户端默认先尝试轮询连接,可显式指定优先使用WebSocket,避免不必要的降级:

var socket = io('http://' + document.domain + ':' + location.port, {
  transports: ['websocket', 'polling']
});

socket.on('connect', function() {
    console.log('connected');
})

socket.on('message', function(data) {
    const p = document.createElement('p');
    p.innerHTML = data;
    document.querySelector('#panel').append(p);
})

document.querySelector('#send').onclick = () => {
    socket.send(document.querySelector('#userin').value)
}

4. 依赖冲突排查

如果修改后仍未生效,可卸载相关依赖后重装,避免版本不兼容问题:

pip uninstall -y flask-socketio python-socketio eventlet gevent gevent-websocket
pip install flask-socketio eventlet

内容的提问来源于stack exchange,提问作者yousef shaban

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 09:24:07