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

从Flask迁移到FastAPI,Pydantic响应模型创建失败求助

修复方案

你的问题出在两个核心点:

  1. 类型注解写法无效:[list, int]不是Pydantic可识别的标准类型提示语法,无法正确解析复合类型结构。
  2. 模型结构不匹配:你的响应是顶层JSON数组(包含对象列表和整数),而非带tuple字段的JSON对象,原模型设计不符合实际响应结构。

步骤1:定义子模型

先为响应中每个包含prob和server的对象创建子模型:

from pydantic import BaseModel
from typing import List, Tuple

class ServerPrediction(BaseModel):
    prob: float
    server: str

步骤2:定义顶层响应模型

根据你使用的Pydantic版本,选择对应写法:

Pydantic v2 写法

使用RootModel包装顶层元组类型:

class PredictionResponse(RootModel[Tuple[List[ServerPrediction], int]]):
    """Response Model for Prediction"""
    pass

在FastAPI路由中使用:

from fastapi import FastAPI

app = FastAPI()

@app.get("/predict", response_model=PredictionResponse)
def get_prediction():
    # 示例返回数据
    pred_list = [
        {"prob": 0.504382973684, "server": "sdkjfhkjsdjh1223"},
        {"prob": 0.378097465773, "server": "sdfjkhkjsdj8233y3"},
        {"prob": 0.370512958735, "server": "sdkfjhkjh239486989884"},
        {"prob": 0.369599161425, "server": "sdkjfhkj238683"},
        {"prob": 0.369443692878, "server": "sdjhjdfh3764"}
    ]
    return (pred_list, 200)

Pydantic v1 写法

使用__root__字段定义顶层非对象类型:

class PredictionResponse(BaseModel):
    """Response Model for Prediction"""
    __root__: Tuple[List[ServerPrediction], int]

路由使用方式与v2一致。

关键说明

  • Tuple[List[ServerPrediction], int]明确指定响应是包含两个元素的元组:第一个元素是ServerPrediction对象的列表,第二个是整数状态码。
  • 用RootModel(v2)或__root__(v1)是因为响应顶层为JSON数组而非对象,Pydantic需要这种方式处理非对象类型的顶层响应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 13:12:28