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

使用Pydantic优雅处理几何数据结构 - 前端输入验证实践

使用Pydantic优雅处理几何数据结构 - 前端输入验证实践

一、应用场景解析

在视频分析类项目中,前端常需要传递几何坐标数据。例如智能安防系统中,需要接收:

  • 视频流地址(rtsp_video)
  • 检测区域坐标点(points)
  • 警戒通道坐标(passway)

这些数据需要满足严格的格式要求:

{"rtsp_video": "rtsp://localhost:5555/live","points": [[100, 400], [500, 400], [500, 200], [100, 200]],"passway": [[[500, 200], [100, 200]]]
}

二、基础模型设计

2.1 优化方案

from typing import Annotated
from pydantic import BaseModel, Fieldclass VideoData(BaseModel):"""视频分析基础数据模型"""rtsp_video: str = Field(example="rtsp://localhost:5555/live",description="RTSP视频流地址")points: list[Annotated[list[int], Field(min_length=2, max_length=2,example=[100, 400])]]passway: list[list[Annotated[list[int], Field(min_length=2,max_length=2,example=[[500, 200]])]]]

支持传入的json参考:

{
“rtsp_video”: “rtsp://localhost:5555/live”,
“points”:[[100, 400], [500, 400], [500, 200], [100, 200]],
“passway”: [[[500, 200], [100, 200]]]
}

2.2 方案优化建议

  1. 使用类型别名增强可读性
Coordinate = Annotated[list[int], Field(min_length=2, max_length=2, example=[100, 400])
]
  1. 基础结构化嵌套模型
class Point(BaseModel):x: inty: intclass Line(BaseModel):start: Pointend: Pointclass OptimizedVideoData(BaseModel):rtsp_video: strpoints: list[Point]passway: list[list[Line]]

三、验证增强策略

3.1 数值范围约束

from pydantic import conintPixelCoordinate = Annotated[conint(ge=0, le=1920),  # 假设最大分辨率1920x1080Field(description="像素坐标系坐标值")
]

3.2 自定义验证器

from pydantic import validatorclass EnhancedPoint(BaseModel):x: inty: int@validator('x', 'y')def check_coordinate_range(cls, v):if not (0 <= v <= 1920):raise ValueError("坐标值超出有效范围")return v

四、最佳实践建议

  1. 为字段添加文档注释
class DocumentedVideoData(BaseModel):"""视频分析数据模型(带完整文档)"""rtsp_video: str = Field(...,title="视频流地址",description="RTSP协议的视频流访问地址",example="rtsp://localhost:5555/live")
  1. 配置模型行为
class Config:json_schema_extra = {"points_example": [[100, 400], [500, 400]],"passway_example": [[[500, 200], [100, 200]]]}
http://www.xdnf.cn/news/125.html

相关文章:

  • RESTful API工具和框架详解
  • (论文阅读)RNNoise 基于递归神经网络的噪声抑制库
  • 第五章 SQLite数据库:5、SQLite 进阶用法:JOIN、UNION、TRIGGER、INDEX、ALIAS、INDEXED BY 等模块
  • 2025年GitHub平台上的十大开源MCP服务器汇总分析
  • 主动防御VS自动化筛查:渗透测试与漏洞扫描的深度攻防指南
  • 【Easylive】微服务架构在系统中的优缺点的具体体现
  • Linux之基础命令
  • 文件上传漏洞
  • 【Linux】进程概念(二):PCB,ps 和 fork
  • 《AI大模型应知应会100篇》第25篇:Few-shot与Zero-shot使用方法对比
  • 残差连接缓解梯度消失的含义;残差连接的真正含义:F(x) = y - x ;y=F(x)+x
  • vue3 nprogress 使用
  • 4月18日星期五今日早报简报微语报早读
  • 从PDF到播客:MIT开发的超越NotebookLM的工具
  • Python项目调用Java数据接口实现CRUD操作
  • 游戏一:俄罗斯方块简易版
  • 关于yarn和hadoop
  • Java学习手册:Java并发编程最佳实践
  • Spring Boot 3 + SpringDoc:打造接口文档
  • docker.desktop下安装普罗米修斯prometheus、grafana并看服务器信息
  • PHP腾讯云人脸核身获取NONCE ticket
  • 系统架构设计师:流水线技术相关知识点、记忆卡片、多同类型练习题、答案与解析
  • Python爬虫第17节-动态渲染页面抓取之Selenium使用下篇
  • 过去十年前端框架演变与技术驱动因素剖析
  • Linux网络编程 深入解析TFTP协议:基于UDP的文件传输实战
  • jQuery — DOM与CSS操作
  • 使用 PySpark 批量清理 Hive 表历史分区
  • Layui Table组件,设置data数据源,以及page为False,表格只能显示10条数据的问题
  • Spring Boot日志系统详解:Logback与SLF4J的默认集成
  • J值即正义——Policy Gradient思想、REINFORCE算法,以及贪吃蛇小游戏(三)