0

0

Python接口数据校验方法_pydantic实战解析【技巧】

冷炫風刃

冷炫風刃

发布时间:2025-12-26 22:20:03

|

508人浏览过

|

来源于php中文网

原创

pydantic v2 默认禁止额外字段且校验错误提示不友好,需配置 model_config={"extra": "allow"} 并扁平化 errors() 输出;自定义校验器必须显式 return 值,model_dump() 替代 dict() 且默认行为不同。

python接口数据校验方法_pydantic实战解析【技巧】

Pydantic v2 里 BaseModel 默认不再允许额外字段

很多老项目升级到 Pydantic v2 后,接口接收 JSON 时突然报 ValidationError,提示 “extra fields not permitted”,其实不是数据错了,而是模型默认关掉了未知字段。这和 v1 的宽松行为完全不同。

解决方法是显式开启允许:

from pydantic import BaseModel
<p>class UserRequest(BaseModel):
name: str
age: int</p><pre class='brush:python;toolbar:false;'>class Config:
    extra = "allow"  # v1 写法,v2 中已弃用

v2 正确写法改用 model_config

class UserRequest(BaseModel):
    name: str
    age: int
<pre class='brush:python;toolbar:false;'>model_config = {"extra": "allow"}
  • "allow":忽略多余字段,不报错
  • "ignore":静默丢弃(不推荐,容易掩盖前端传参错误)
  • "forbid":严格禁止(默认值,也是最安全的选择)

嵌套结构校验失败时,ValidationErrorerrors() 输出难读

当请求体含多层嵌套(比如 address.city 缺失),默认的 e.errors() 返回的是带 loc 元组的字典,像 [{"loc": ["address", "city"], "msg": "Field required"}],直接返回给前端不友好。

立即学习Python免费学习笔记(深入)”;

建议封装一层扁平化处理:

def format_pydantic_errors(e):
    return [
        {"field": ".".join(err["loc"]), "message": err["msg"]}
        for err in e.errors()
    ]
<h1>使用示例</h1><p>try:
UserRequest(**data)
except ValidationError as e:
return {"errors": format_pydantic_errors(e)}
  • 避免直接暴露 loc 给前端,尤其是内部字段名(如 __root__
  • 如果用了 Field(alias=...)loc 仍显示原始字段名,需手动映射别名
  • 批量校验多个对象时,ValidationError 会合并所有错误,errors() 仍可用

@field_validator 做业务逻辑校验,但忘记 return value

自定义校验器里最常踩的坑:写了逻辑判断却没返回值,导致字段被清空为 None。Pydantic 不会帮你兜底。

AI Code Reviewer
AI Code Reviewer

AI自动审核代码

下载

比如校验手机号格式后忘了返回:

from pydantic import field_validator
<p>@field_validator("phone")
def validate_phone(cls, v):
if not re.match(r"^1[3-9]\d{9}$", v):
raise ValueError("invalid phone number")</p><h1>❌ 忘了 return v → 字段值变成 None
  • 所有 @field_validator 函数必须显式 return 处理后的值(哪怕没改)
  • 若想支持空值跳过校验,加参数 skip_on_failure=True,但慎用,容易掩盖必填逻辑
  • 涉及数据库查重等 IO 操作,不要放在这里——validator 是同步且无 await 支持的

model_dump()dict() 在 v2 中行为不同

v2 废弃了 .dict(),改用 .model_dump()。但很多人迁移时只改函数名,没注意默认参数变化:旧版 .dict(exclude_unset=True) 对应新版的 .model_dump(exclude_unset=True),但默认值变了。

关键差异:

  • .model_dump() 默认导出所有字段(含未设置的默认值)
  • .model_dump(exclude_unset=True) 才等价于旧版 .dict()
  • 如果字段有 default_factory,且没被赋值,exclude_unset=True 也不会排除它——得用 exclude_defaults=True

API 响应常用组合:

user = UserResponse(name="Alice", age=25)
user.model_dump(exclude_unset=True, exclude_none=True)

这样既不传未设置字段,也不传 None 值,更符合 RESTful 接口习惯。

字段级别控制还有 aliasby_aliasexclude 等,但多数场景只需记住:不加 exclude_unset 就很可能把默认值也吐出去,前端拿到意外字段。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
PHP API接口开发与RESTful实践
PHP API接口开发与RESTful实践

本专题聚焦 PHP在API接口开发中的应用,系统讲解 RESTful 架构设计原则、路由处理、请求参数解析、JSON数据返回、身份验证(Token/JWT)、跨域处理以及接口调试与异常处理。通过实战案例(如用户管理系统、商品信息接口服务),帮助开发者掌握 PHP构建高效、可维护的RESTful API服务能力。

179

2025.11.26

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

453

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

331

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1846

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

614

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2351

2025.12.29

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

1

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号