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

求可对接RTK Query流式更新示例的FastAPI WebSocket接口实现案例

适配RTK Query示例的FastAPI实现代码
  • 先安装运行所需依赖:
    pip install fastapi uvicorn pydantic websockets

该实现完全匹配前端逻辑要求:

  1. 提供GET /messages/{channel}接口,返回对应频道的历史消息数组,结构和前端Message接口完全对齐
  2. 提供WebSocket服务在8080端口,推送的消息格式符合前端校验规则
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from typing import Literal, List, Dict, Set

Channel = Literal["redux", "general"]

class Message(BaseModel):
    id: int
    channel: Channel
    userName: str
    text: str

app = FastAPI()

# 配置跨域,允许前端访问,可根据你的前端实际地址调整白名单
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# 内存存储调试用数据,生产环境可替换为数据库
# 各频道历史消息
channel_messages: Dict[Channel, List[Message]] = {
    "redux": [
        Message(id=1, channel="redux", userName="system", text="欢迎来到Redux频道"),
        Message(id=2, channel="redux", userName="user1", text="RTK Query Websocket模式适配完成")
    ],
    "general": [
        Message(id=1, channel="general", userName="system", text="欢迎来到通用频道")
    ]
}
# 消息自增ID计数器
id_counter = 3
# 按频道分组存储活跃WebSocket连接
active_connections: Dict[Channel, Set[WebSocket]] = {
    "redux": set(),
    "general": set()
}

# REST接口:获取对应频道历史消息
@app.get("/messages/{channel}", response_model=List[Message])
def get_messages(channel: Channel):
    return channel_messages.get(channel, [])

# WebSocket服务
@app.websocket("/")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    current_channel: Channel | None = None
    try:
        while True:
            # 接收客户端发送的新消息,存储后广播给对应频道所有在线用户
            data = await websocket.receive_json()
            message = Message(**data)
            global id_counter
            # 前端发新消息时可传id=0,由服务端生成自增ID
            if message.id == 0:
                message.id = id_counter
                id_counter += 1
            # 存入历史消息
            channel_messages[message.channel].append(message)
            # 广播给对应频道所有连接
            for conn in active_connections[message.channel]:
                await conn.send_json(message.model_dump())
            # 记录当前连接所属频道,断开时清理
            current_channel = message.channel
            if websocket not in active_connections[current_channel]:
                active_connections[current_channel].add(websocket)
    except WebSocketDisconnect:
        if current_channel and websocket in active_connections[current_channel]:
            active_connections[current_channel].remove(websocket)

使用说明

  • 启动服务命令:uvicorn main:app --host 0.0.0.0 --port 8080 --reload
  • 前端需要调整两处配置:1. fetchBaseQuery的baseUrl改为http://localhost:8080;2. WebSocket连接地址保持ws://localhost:8080即可
  • 测试时可通过WebSocket调试工具向服务端发送符合格式的消息,前端RTK Query缓存会自动更新对应频道的消息列表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:57:03