Pydantic字段级校验:解锁@validator的12种应用

news/2025/3/25 5:17:49/文章来源:https://www.cnblogs.com/Amd794/p/18787890

title: Pydantic字段级校验:解锁@validator的12种应用
date: 2025/3/23
updated: 2025/3/23
author: cmdragon

excerpt:
Pydantic校验系统支持通过pre验证器实现原始数据预处理,在类型转换前完成字符清洗等操作。格式验证涵盖正则表达式匹配与枚举值约束,确保护照编号等字段符合规范。动态校验机制处理跨字段依赖关系及环境感知验证,根据运行时条件调整校验规则。安全校验模块防御SQL注入与XSS攻击,采用字符过滤和HTML转义策略。高级转换功能实现地址标准化、敏感信息加密等数据处理,企业级实践包含分布式ID验证与金融精度控制。校验错误处理需关注类型一致性及验证顺序,遵循"早失败"原则构建模块化校验规则库,推荐使用参数化查询等最佳安全实践。

categories:

  • 后端开发
  • FastAPI

tags:

  • Pydantic字段校验
  • @validator高级应用
  • 数据验证模式
  • 防御式编程
  • 校验器组合
  • 动态依赖验证
  • 企业级数据清洗

image

image

扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

探索数千个预构建的 AI 应用,开启你的下一个伟大创意


第一章:基础校验模式

1.1 类型强制转换

from pydantic import BaseModel, validatorclass CurrencyConverter(BaseModel):amount: str@validator("amount", pre=True)def string_to_float(cls, v):return float(v.strip("$"))# 自动转换 "$100.5" → 100.5
print(CurrencyConverter(amount="$100.5").amount)  

pre验证器特性

  • 在类型转换前执行
  • 支持原始数据清洗
  • 可处理非结构化输入

第二章:格式验证

2.1 正则表达式验证

import reclass IdentityForm(BaseModel):passport: str@validator("passport")def validate_passport(cls, v):if not re.match(r"^[A-PR-WY][1-9]\d\s?\d{4}[A-Z]$", v):raise ValueError("护照号码格式错误")return v.upper().replace(" ", "")

2.2 枚举值约束

from enum import Enumclass Department(Enum):HR = 1IT = 2class Employee(BaseModel):dept: int@validator("dept")def check_department(cls, v):return Department(v).name  # 自动转换数字为枚举名称

第三章:动态校验

3.1 跨字段依赖验证

class OrderForm(BaseModel):product_type: strweight: float@validator("weight")def check_weight(cls, v, values):if values.get("product_type") == "fragile" and v > 10:raise ValueError("易碎品不得超过10kg")return v

3.2 环境感知校验

import osclass EnvAwareValidator(BaseModel):api_key: str@validator("api_key")def check_key_format(cls, v):env = os.getenv("APP_ENV", "dev")if env == "prod" and len(v) < 32:raise ValueError("生产环境密钥强度不足")return v

第四章:安全校验

4.1 SQL注入防御

class QuerySafe(BaseModel):search_term: str@validator("search_term")def sanitize_input(cls, v):forbidden = ["'", ";", "--", "/*"]if any(c in v for c in forbidden):raise ValueError("检测到危险字符")return v.replace("%", "\\%")

4.2 XSS攻击过滤

from html import escapeclass CommentForm(BaseModel):content: str@validator("content")def sanitize_html(cls, v):return escape(v).replace("\n", "<br>")

第五章:高级转换

5.1 数据归一化

class AddressNormalizer(BaseModel):street: str@validator("street")def standardize_address(cls, v):replacements = {"St.": "Street","Ave": "Avenue"}for k, v in replacements.items():v = v.replace(k, v)return v.title()

5.2 加密字段处理

from cryptography.fernet import Fernetclass SecureData(BaseModel):secret: str@validator("secret")def encrypt_value(cls, v):key = Fernet.generate_key()return Fernet(key).encrypt(v.encode())

第六章:企业级实践

6.1 分布式ID验证

import snowflakeclass SnowflakeValidator(BaseModel):object_id: str@validator("object_id")def validate_snowflake(cls, v):try:snowflake.deconstruct(v)return vexcept Exception:raise ValueError("非法分布式ID格式")

6.2 金融精度控制

from decimal import Decimal, ROUND_HALF_UPclass FinancialModel(BaseModel):amount: float@validator("amount")def monetary_precision(cls, v):return Decimal(str(v)).quantize(Decimal("0.00"),rounding=ROUND_HALF_UP)

课后Quiz

Q1:pre验证器的执行时机是?
A) 类型转换后
B) 类型转换前
C) 最终验证阶段

Q2:防御SQL注入的最佳方法是?

  1. 字符串替换
  2. 参数化查询
  3. 正则过滤

Q3:处理多字段依赖应使用?


错误解决方案速查表

错误信息 原因分析 解决方案
ValidationError: value is not a valid integer 类型转换前未清洗数据 添加pre=True验证器
ValueError: 检测到危险字符 SQL注入防御生效 使用参数化查询替代直接拼接
AssertionError: 校验顺序错误 依赖字段未优先验证 调整字段定义顺序
TypeError: 校验器返回类型错误 验证器返回值与声明类型不符 检查验证器逻辑

架构原则:字段校验应遵循"早失败"原则,在数据入口处完成所有验证。建议建立企业级校验规则库,通过装饰器模式实现校验逻辑的模块化管理。

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:

往期文章归档:

  • Pydantic配置继承抽象基类模式 | cmdragon's Blog
  • Pydantic多态模型:用鉴别器构建类型安全的API接口 | cmdragon's Blog
  • FastAPI性能优化指南:参数解析与惰性加载 | cmdragon's Blog
  • FastAPI依赖注入:参数共享与逻辑复用 | cmdragon's Blog
  • FastAPI安全防护指南:构建坚不可摧的参数处理体系 | cmdragon's Blog
  • FastAPI复杂查询终极指南:告别if-else的现代化过滤架构 | cmdragon's Blog
  • FastAPI 核心机制:分页参数的实现与最佳实践 | cmdragon's Blog
  • FastAPI 错误处理与自定义错误消息完全指南:构建健壮的 API 应用 🛠️ | cmdragon's Blog
  • FastAPI 自定义参数验证器完全指南:从基础到高级实战 | cmdragon's Blog
  • FastAPI 参数别名与自动文档生成完全指南:从基础到高级实战 🚀 | cmdragon's Blog
  • FastAPI Cookie 和 Header 参数完全指南:从基础到高级实战 🚀 | cmdragon's Blog
  • FastAPI 表单参数与文件上传完全指南:从基础到高级实战 🚀 | cmdragon's Blog
  • FastAPI 请求体参数与 Pydantic 模型完全指南:从基础到嵌套模型实战 🚀 | cmdragon's Blog
  • FastAPI 查询参数完全指南:从基础到高级用法 🚀 | cmdragon's Blog
  • FastAPI 路径参数完全指南:从基础到高级校验实战 🚀 | cmdragon's Blog
  • FastAPI路由专家课:微服务架构下的路由艺术与工程实践 🌐 | cmdragon's Blog
  • FastAPI路由与请求处理进阶指南:解锁企业级API开发黑科技 🔥 | cmdragon's Blog
  • FastAPI路由与请求处理全解:手把手打造用户管理系统 🔌 | cmdragon's Blog
  • FastAPI极速入门:15分钟搭建你的首个智能API(附自动文档生成)🚀 | cmdragon's Blog
  • HTTP协议与RESTful API实战手册(终章):构建企业级API的九大秘籍 🔐 | cmdragon's Blog
  • HTTP协议与RESTful API实战手册(二):用披萨店故事说透API设计奥秘 🍕 | cmdragon's Blog
  • 从零构建你的第一个RESTful API:HTTP协议与API设计超图解指南 🌐 | cmdragon's Blog
  • Python异步编程进阶指南:破解高并发系统的七重封印 | cmdragon's Blog
  • Python异步编程终极指南:用协程与事件循环重构你的高并发系统 | cmdragon's Blog
  • Python类型提示完全指南:用类型安全重构你的代码,提升10倍开发效率 | cmdragon's Blog
  • 三大平台云数据库生态服务对决 | cmdragon's Blog
  • 分布式数据库解析 | cmdragon's Blog
  • 深入解析NoSQL数据库:从文档存储到图数据库的全场景实践 | cmdragon's Blog
  • 数据库审计与智能监控:从日志分析到异常检测 | cmdragon's Blog
  • 数据库加密全解析:从传输到存储的安全实践 | cmdragon's Blog
  • 数据库安全实战:访问控制与行级权限管理 | cmdragon's Blog
  • 数据库扩展之道:分区、分片与大表优化实战 | cmdragon's Blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/904221.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20244126 2024-2025-2 《python程序设计》实验一报告

课程:《Python程序设计》 班级:2441 姓名:马晓霞 学号:20244126 实验教师:王志强 实验日期:2025年3月23日 必修/选修:公选课 (一)实验内容 1.熟悉Python开发环境 2.练习Python运行,调试技能 3.编写技能,练习变量和类型、字符串、对象、缩进和注释等 4.编写一个猜数字…

1.6K star!这个开源文本提取神器,5分钟搞定PDF/图片/Office文档!

Kreuzberg 是一个基于 Python 的文本提取库,支持从 PDF、图像、Office 文档等 20+ 格式中提取文本内容。采用 MIT 开源协议,具备本地处理、异步架构、智能 OCR 等特性,特别适合需要隐私保护的文档处理场景。嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开…

leetcode每日一题:判断一个括号字符串是否有效

题目 一个括号字符串是只由 ( 和 ) 组成的 非空 字符串。如果一个字符串满足下面 任意 一个条件,那么它就是有效的:字符串为 (). 它可以表示为 AB(A 与 B 连接),其中A 和 B 都是有效括号字符串。 它可以表示为 (A) ,其中 A 是一个有效括号字符串。给你一个括号字符串 s 和…

实验2c语言分支与循环基础应用编程

任务一:1 #include <stdio.h>2 #include <stdlib.h>3 #include <time.h>4 5 #define N 56 7 int main() {8 int number;9 int i; 10 11 srand(time(0)); // 以当前系统时间作为随机种子 12 for(i = 0; i < N; ++i) { 13 nu…

矿用人员违规闯入监控报警系统

矿用人员违规闯入监控报警系统,设置警戒预警功能,巷道正在行车时,当有行人闯入时,及时抓拍、识别现场违章入侵人员同时闪光警示和音箱报警提示禁止进入,在绞车运行期间人员误入斜巷能够及时报警,自动停止绞车运行。该系统做到绞车运行和行人的安全隔离,有力保障了煤矿斜…

工厂车间人员违规闯入禁区报警系统

工厂车间人员违规闯入禁区报警系统前端设备嵌入AI人体识别算法,对人员的检测、跟踪,实现对人体检测分析识别,实时预警周界区域内人员入侵事件。当有可疑人员进入监测范围内可对其自动识别,即对其抓拍并将当时图像传输到管理中心,在管理中心输出报警信号。工厂车间人员违规…

iis备份还原工具,想要备份iis有哪些工具可以实现?

想要备份IIS(Internet Information Services),可以使用多种专门的备份还原工具。以下是一些常用的IIS备份还原工具及其简要介绍:IISBackUp 功能:专注于备份和恢复IIS站点设置,包括网站配置文件、站点绑定信息、应用程序池设置、SSL证书和密钥信息等。 特点: 提供一种方便…

集合的通用遍历方法--java进阶day09

1.集合的三种通用遍历方法之前我们学习过集合的遍历方法,为什么这里还要再学呢? 这是因为,之前我们用的遍历方法使用了索引,但我们知道set接口的实现类的集合均无索引,所以我们要学习通用的遍历方法 2.迭代器遍历 1.迭代器 迭代器叫做Iterator,是一个接口,我们知道接口是…

安卓逆向:adb连接模拟器进行jeb动态调试

这篇文章的内容记录下我在各个文章搜索学习最后解决了安卓进行模拟器动态调试的方法。 参考的文章有: ADB:https://blog.csdn.net/Python_0011/article/details/132040387 ADB的使用https://blog.csdn.net/SM1555/article/details/112608576 Androidkiller:https://blog.csdn.…

Java中的Map CAS AQS

Java中的Map 1.基本介绍和api使用就免了 Java中的Map是一种用于存储键值对(Key-Value)的接口,属于java.util包,是集合框架的重要组成部分。 2.HashMap从图中的关系可以看出这些类间关系了。 ①基本分析 HashMap的一些属性 // 默认容量 16 static final int DEFAULT_INITIAL…

一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!

前言 今天大姚给大家分享一款基于 .NET 开源(GPL-2.0 license)、免费、功能强大的 Windows 远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议:mRemoteNG。 项目介绍 mRemoteNG是一款基于 .NET 开源(GPL-2.0 license)、免费、功能强大的 Windows 远程连接管理工具,支…

探秘Transformer系列之(17)--- RoPE

从零开始解析Transformer,目标是:(1) 解析Transformer如何运作,以及为何如此运作,让新同学可以入门;(2) 力争融入一些比较新的或者有特色的论文或者理念,让老鸟也可以有所收获。探秘Transformer系列之(17)--- RoPE 目录探秘Transformer系列之(17)--- RoPE文章总表0x0…