当前位置: 首页 > news >正文

fastapi: 封装接口的数据返回格式,支持文档显示数据格式

一,代码:

返回数据用的泛型封装类:

# app/core/BaseResponse.py
from typing import Annotated, List, TypeVar, Generic, Optional
from pydantic import BaseModel# 1. 定义一个泛型变量 T,代表 data 字段可能接入的任何 Pydantic 模型
T = TypeVar("T")# 2. 统一定义最外层的结构
class ApiResponse(BaseModel, Generic[T]):code: int = 200message: str = "success"data: Optional[T] = None  # data 可以是任意类型 T# 便捷的类方法,方便业务代码调用# 返回成功数据@classmethoddef success(cls, data: Optional[T] = None, message: str = "success"):return cls(code=200, message=message, data=data)# 返回失败数据@classmethoddef fail(cls, code: int = 400, message: str = "fail"):return cls(code=code, message=message, data={})

接口调用:

# 输出给前端的用户信息(安全公开,不含密码,包含只读字段)
class UserResponse(BaseModel):id: int = Field(..., description="用户的唯一ID")username: str = Field(..., description="用户名")nickname: str = Field(..., description="用户昵称")class Config:from_attributes = Truejson_schema_extra = {"example": {"id": 1, "username": "alex_green", "nickname": "alex@example.com"}}# 这是你需要补上的分页响应模型
class UserListPageResponse(BaseModel, Generic[T]):total: intitems: List[T] # 核心:这里告诉 Pydantic,items 里面才是用户列表@router.get("/all2", response_model=ApiResponse[UserListPageResponse[UserResponse]], summary="获取商品和用户数据")
async def get_all_users2(request: Request,prod_data: Annotated[UserListForm, Query()],db: AsyncSession = Depends(get_db)):# 参数page = prod_data.pagepage_size = prod_data.page_size# 使用 func.count().over() 作为一个隐藏列stmt = (select(User, func.count().over().label("total_count")).where(User.status == 1).offset((page - 1) * page_size).limit(page_size))result = await db.execute(stmt)# 因为多查了一个 count 列,result 出来的每一行是一个元组 (User对象, total_count值)rows = result.all()# 解析结果if not rows:return {"total": 0, "page": page, "size": page_size, "items": []}# 无论哪一行,对应的 total_count 都是一样的,取第一行的即可total = rows[0].total_countitems = [row.User for row in rows]# 数据data = {"items": items,"total": total,}# return ApiResponse.fail(code=403,message="测试报错")return ApiResponse.success(data=data)

 

二,测试效果:

数据返回

image

文档:

image

 

http://www.jsqmd.com/news/1256857/

相关文章:

  • NTP局域网时间同步实操验证
  • 3个颠覆性功能:为什么ImageGlass正在重新定义图片浏览体验
  • 如何快速检测微信单向好友:5分钟清理无效社交关系终极指南
  • 高颜值的火锅店|南昌同城多场景火锅觅食实用指南 - 品牌2026推荐
  • 5分钟搞定:Beyond Compare 5永久授权终极教程
  • (普通、扩展、二进制扩展) 欧几里得算法
  • 终极显示器色彩校准指南:3分钟解决广色域过饱和问题
  • 振动反馈:Vibrator模块实现触觉反馈(40)
  • Switch破解新纪元:5分钟掌握大气层系统的完整安装与优化秘诀
  • Demo 里跑通就敢上线?LangChain Agent 团队协作崩盘实录与排查指南
  • 武汉大金空调维修清洗加氟电话|捌壹捌家电24小时上门故障抢修靠谱团队 - 资讯速览
  • Python aganitha-intern-task 包:功能详解、安装配置与实战案例
  • Astrbot+Napcat QQ机器人部署过程记录
  • 意识的起源与存在原因——协同本体论视域下的一场相变
  • 高并发内存池 - 整体框架设计
  • 邯郸LV老花包包回收就来好运来奢品行15633071016 - mazhaoyun11
  • 开一家火一家的火锅品牌!南昌全场景火锅觅食指南,适配各类聚餐需求 - 品牌2026推荐
  • MonkeyCode、Cursor、Claude Code 与 Copilot 的选型思路对比
  • 免费离线OCR终极指南:Umi-OCR如何轻松解决PDF文字无法复制难题?
  • Taste-Skill 能力效果展示与实战解析
  • 3分钟掌握WaveTools鸣潮工具箱:解锁高帧率画质的终极指南
  • Alpha混合图解:搞懂透明渲染只需这一篇
  • 2026AI论文写作工具平台排行榜 热门产品优劣对比 - 资讯快报
  • 上海黄金首饰回收指南|全套避坑要点!中检认证+光谱仪无损检测,大鱼奢侈品实力出圈 - 大鱼奢侈品
  • 宁波母婴消费服务GEO服务商代理加盟怎么选?2026年宁波GEO代理服务商选型靠谱本地推荐指南 - 科技快讯
  • 如何让老旧iPhone/iPad重获新生:终极系统降级与恢复完全指南
  • 提升分析可靠性的颗粒状二水合磷酸氢二钠应用分享
  • 【题解】WebGoC 118869.项链
  • 宝塔面板Redis密码修改指南:SSH命令修改 vs 面板UI界面修改,哪个更靠谱?
  • 泸州本地家庭装修靠谱口碑推荐,刚需平层装修 / 改善户型设计 / 大户型全屋整装高端落地方案 - 资讯速览