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

如何配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:52:43