如何同时使用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
相关产品推荐
相关产品推荐

