如何配置Flask-RESTful与Flask-SocketIO?求整合方案
Flask-RESTful 与 Flask-SocketIO 整合配置方案
1. 安装依赖
先安装Flask-SocketIO及推荐的异步服务器依赖:
pip install flask-socketio eventlet
2. 调整配置类
在你的配置类中添加SocketIO相关配置项:
class DevApplicationConfiguration: DEBUG = True TESTING = True SQLALCHEMY_DATABASE_URI = ( f"postgresql://{config('DB_USER')}:{config('DB_PASSWORD')}" f"@{config('DB_HOST')}/{config('DB_NAME')}" ) # SocketIO异步模式配置,eventlet为推荐选项 SOCKETIO_ASYNC_MODE = 'eventlet'
3. 整合SocketIO到应用工厂
修改create_app函数,初始化SocketIO实例并处理跨域兼容:
from decouple import config from flask import Flask from flask_cors import CORS from flask_migrate import Migrate from flask_restful import Api from flask_socketio import SocketIO # 导入SocketIO扩展 from db import db from resources.routes import routes class DevApplicationConfiguration: DEBUG = True TESTING = True SQLALCHEMY_DATABASE_URI = ( f"postgresql://{config('DB_USER')}:{config('DB_PASSWORD')}" f"@{config('DB_HOST')}/{config('DB_NAME')}" ) SOCKETIO_ASYNC_MODE = 'eventlet' def create_app(config="config.DevApplicationConfiguration"): app = Flask(__name__) app.config.from_object(DevApplicationConfiguration) # 初始化数据库迁移 migrate = Migrate(app, db) # 配置CORS,支持WebSocket跨域凭证 CORS(app, supports_credentials=True) # 初始化Flask-RESTful路由 api = Api(app) [api.add_resource(*r) for r in routes] # 初始化SocketIO,配置跨域允许源(开发环境用*,生产环境指定具体域名) socketio = SocketIO(app, cors_allowed_origins="*", async_mode=app.config['SOCKETIO_ASYNC_MODE']) # 示例SocketIO事件处理(可移至单独模块如sockets.py) @socketio.on('connect') def handle_connect(): print('客户端已建立WebSocket连接') @socketio.on('message') def handle_message(data): print(f'收到客户端消息: {data}') socketio.emit('response', f'服务器已接收消息: {data}') return app, socketio # 返回app和socketio实例
4. 修改应用启动方式
替换原有的app.run(),使用SocketIO的启动方法:
# 项目入口文件(如main.py) from your_app_module import create_app, db app, socketio = create_app() if __name__ == '__main__': # 初始化数据库(首次运行时执行) with app.app_context(): db.create_all() # 启动SocketIO服务器 socketio.run(app, debug=app.config['DEBUG'])
关键注意事项
- 跨域配置:生产环境需将
cors_allowed_origins设置为具体前端域名(如"https://your-frontend.com"),避免使用通配符*。 - 异步模式:优先使用eventlet或gevent作为异步引擎,避免默认的threading模式(生产环境性能不足)。
- 数据库操作:在SocketIO事件处理函数中操作数据库时,需确保处于Flask应用上下文内,可通过
with app.app_context():手动推送上下文。 - 生产部署:生产环境不要用
socketio.run(),改用eventlet/gevent的WSGI服务器启动,例如:eventlet -w 4 your_app_module:app
内容的提问来源于stack exchange,提问作者Mr. Terminix
相关产品推荐
相关产品推荐

