从Flask迁移到FastAPI,Pydantic响应模型创建失败求助
修复方案
你的问题出在两个核心点:
- 类型注解写法无效:
[list, int]不是Pydantic可识别的标准类型提示语法,无法正确解析复合类型结构。 - 模型结构不匹配:你的响应是顶层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
相关产品推荐
相关产品推荐

