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

如何同时使用Waitress与Eventlet服务器部署带Socket.IO的Flask应用?

Flask-Socket.IO生产环境部署方案(替代Waitress)

问题本质

Waitress是纯WSGI服务器,不支持WebSocket协议,而Flask-Socket.IO依赖WebSocket实现双向通信,因此不能同时使用Waitress的serve()和Socket.IO的run(),必须由Socket.IO接管服务器启动流程,它会自动搭配你已配置的Eventlet异步模式运行。

修正后的完整代码

import eventlet
import os
from flask import Flask
from flask_socketio import SocketIO

app = Flask(__name__)
async_mode = None

# 自动选择异步模式
if async_mode is None:
    try:
        import eventlet
        async_mode = 'eventlet'
    except ImportError:
        pass
if async_mode is None:
    async_mode = 'threading'

print(f'async_mode is {async_mode}')

if async_mode == 'eventlet':
    eventlet.monkey_patch()
    socketio = SocketIO(app, cors_allowed_origins='*', async_mode=async_mode)

# 示例Socket.IO事件(根据业务需求修改)
@socketio.on('chat_message')
def handle_chat_message(data):
    print(f'Received message: {data}')
    socketio.emit('chat_response', f'You said: {data}')

if __name__ == '__main__':
    # 从环境变量读取运行模式,避免硬编码
    env_mode = os.getenv('FLASK_ENV', 'prod')
    
    if env_mode == 'dev':
        socketio.run(app, host='0.0.0.0', port=8080, debug=True)
    elif env_mode == 'prod':
        # 生产环境直接用socketio.run启动,自动使用Eventlet服务器
        socketio.run(app, host='0.0.0.0', port=8080, debug=False, log_output=False)

关键注意事项

  • 移除Waitress的serve(app)调用:Waitress无法处理Socket.IO的WebSocket请求,必须用socketio.run()启动服务。
  • 依赖安装:生产环境执行pip install eventlet flask-socketio,确保Eventlet和Flask-Socket.IO版本兼容。
  • 环境变量配置:推荐通过FLASK_ENV环境变量设置运行模式,启动时可执行export FLASK_ENV=prod && python app.py。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:11:21