其他
在 Python 客服系统、API…
适用于需要对支持票据、用户输入、API 请求/响应和配置进行自动验证、序列化和错误处理的 Python 项目。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 57/100 ×0.15
适用场景
在 Python 客服系统、API 或配特定
解决思路
- 用 Python 类型提示定义 BaseModel,让实例化时自动校验并进行类型转换。
- 利用实例化时的自动验证,不手写基础类型检查。
- 用 model_dump() 和 model_dump_json() 做字典与 JSON 序列化。
- 捕获 ValidationError,并对 e.errors() 逐项读取 loc 和 msg。
- 为支持操作实现验证错误日志,记录失败字段和原因。
- 用 Field 给字符串字段设置 min_length、max_length、pattern、strip_whitespace。
- 用 Field 给数值字段设置 gt、ge、lt、le、multiple_of。
- 用 Field 的 title、description、examples、json_schema_extra 补充字段元数据和 JSON Schema 示例。
- 用 Field 的 alias、serialization_alias、exclude、include 控制序列化字段名、排除或包含。
- 用 Annotated[int, Field(...)]、EmailStr、HttpUrl、Optional 等类型组合表达 ID、邮箱、网址和可选字段约束。
- 在 model_config 中设置 str_strip_whitespace、validate_assignment、populate_by_name 等行为。
- 对内部字段用 Field(default=0, exclude=True) 从序列化中排除。
- 用 @field_validator('字段名') 和 @classmethod 编写自定义字段验证器。
- 在自定义字段验证器中用 raise ValueError 拒绝不符合业务规则的值。
- 在邮箱字段验证器中检查黑名单域名,例如阻止 tempmail.com、throwaway.email,并返回小写邮箱。
- 在 subject 字段验证器中要求至少 2 个词,并用 re.search 检查 viagra、casino、lottery 等垃圾内容模式。
- 在 attachments 字段验证器中校验扩展名属于 .pdf、.jpg、.jpeg、.png、.doc、.docx、.txt,并限制最多 5 个附件。
- 在 category 字段验证器中把值规范化为小写和下划线,并校验属于 technical、billing、account、feature_request、bug_report、general_inquiry。
- 用 @model_validator(mode='before') 和 @classmethod 在字段验证前预处理字典。
- 在 model_validator(mode='before') 中根据 scheduled_start 与 scheduled_end 自动计算 estimated_hours。
- 在 model_validator(mode='before') 中把 priority 转为小写。
- 用 @model_validator(mode='after') 做跨字段验证,例如确保 scheduled_end 晚于 scheduled_start。
- 用 @model_validator(mode='after') 按 priority 校验时长:urgent 不超过 2 小时,low 至少 1 小时。
- 用 @model_validator(mode='after') 校验 estimated_hours 与排期时长误差不超过 0.1。
- 用 @model_validator(mode='after') 校验工单排期在营业时间 9 AM - 6 PM 内。
- 对升级模型用 @model_validator(mode='after') 要求 escalation_level >= 3 时必须有 approved_by。
- 在升级模型验证中要求 approved_by 不能等于 requested_by。
- 用 Enum 定义 TicketStatus,例如 OPEN、IN_PROGRESS、PENDING_CUSTOMER、RESOLVED、CLOSED。
- 用嵌套 BaseModel 表达复杂结构,例如 Comment、Attachment、Resolution、CustomerInfo、CompleteTicket。
- 对嵌套列表字段用 Field(default_factory=list) 或默认值,并给列表长度、元素约束,例如 tags 最多 10 个。
- 对附件用 Field(gt=0, le=10_000_000) 限制 file_size_bytes 最大 10MB。
- 在嵌套模型中用 @model_validator(mode='after') 校验状态一致性,例如 resolved/closed 必须有 resolution,in_progress 必须有 assigned_to。
- 在 model_config 中设置 use_enum_values、validate_assignment、json_schema_extra 示例来改善枚举序列化和 API 文档。
- FastAPI 中分离请求模型和响应模型,例如 TicketCreateRequest、TicketUpdateRequest、TicketResponse、TicketListResponse、ErrorResponse。
- 在 FastAPI 响应模型中设置 model_config = {'from_attributes': True} 以兼容 ORM 对象。
- 用 @app.post 的 response_model、status_code、responses 参数声明响应结构、201 创建状态和 400/500 错误模型。
- 用 @app.get 的分页参数 page: int = Field(default=1, ge=1)、page_size: int = Field(default=20, ge=1, le=100) 做分页和过滤。
- 用 @app.patch 和 update.model_dump(exclude_unset=True) 只验证和更新客户端提供的字段。
- 在 FastAPI 端点中捕获异常并 raise HTTPException,返回包含 error_code 和 message 的结构化错误。
- 用 pydantic_settings.BaseSettings 和 SettingsConfigDict 管理配置,设置 env_prefix、env_file、env_file_encoding、case_sensitive、extra。
- 为 DatabaseSettings、RedisSettings、EmailSettings、SupportSettings、ApplicationSettings 等配置类用 Field 设置默认值和取值范围。
- 在配置类中用 @property 组合连接字符串,例如 connection_url 从 host、port、username、password、database 拼接。
- 在主配置类中用 Field(default_factory=DatabaseSettings) 等嵌套配置对象,并在实例化 ApplicationSettings() 时从环境变量和 .env 加载。
- 用 @field_serializer('字段名') 控制序列化,例如掩码 customer_email、把 created_at 格式化为 %Y-%m-%d %H:%M:%S。
- 用 @computed_field 和 @property 添加派生字段,例如 days_open 根据 created_at 计算。
- 用 model_dump() 做标准字典序列化。
- 用 model_dump(mode='python', exclude_none=False) 包含所有字段。
- 用 model_dump_json(indent=2) 输出 JSON。
- 用 model_dump(exclude={...}) 排除字段,用 model_dump(include={...}) 只包含指定字段。
- 在高级验证中用 @field_validator 校验 customer_tier 属于 free、basic、premium、enterprise 并转小写。
- 在 @model_validator(mode='after') 中按 customer_tier、business_impact、affected_users、response_time_hours 加权计算 priority_score。
- 对 PII 用 @field_validator 校验 credit_card_last4 必须为 4 位数字。
- 对 PII 用 re.sub(r'\\D', '', v) 清洗 phone 后要求至少 10 位。
- 用 @model_validator(mode='after') 校验 PII 一致性,例如提供 ssn_last4 时必须提供 credit_card_last4。
- 用 TypeAdapter(List[SupportTicket]) 和 validate_python() 批量验证大量字典数据,复用 adapter。
- 对高性能模型用 ConfigDict(strict=True) 禁止类型强制转换。
- 对多态数据用 discriminated union,例如 Union[EmailTicket, PhoneTicket, ChatTicket] 配合 Field(discriminator='ticket_type')。
- 复用已定义的模型,避免在循环中动态创建模型。
- 错误处理中用 try/except ValidationError,记录 e.error_count()。
- 遍历 e.errors() 记录 field、type、message。
- 对验证失败返回用户友好错误响应或 None,对意外异常用 logger.exception 记录。
- 用 pytest 编写单元测试:有效数据实例化并断言字段值。
- 用 pytest.raises(ValidationError) 测试无效 priority,并检查 e['loc'] 包含 ('priority',)。
- 用 pytest.raises(ValidationError) 测试缺失必填字段。
- 在客服上下文中始终验证来自表单、API、外部系统的用户输入。
- 提供有帮助的错误消息,让用户知道问题及修复方式。
- 记录验证失败以分析表单和文档改进模式。
- 用适当字段约束平衡安全性和可用性。
- 实现类型之外的业务规则验证。
- 谨慎处理 PII:掩码或加密敏感数据,并从日志中排除。
- 对模型进行版本化以保持 API 兼容。
- 测试边界条件和异常输入。
- 用 Field 描述和 JSON schema 示例充分文档化模型。
- 监控高并发操作的验证耗时。
- 使用请求/响应分离模式,而不是同一模型同时做输入和输出。
- 对可变默认值用 Field(default_factory=list),不要用 tags: list[str] = []。
- 对派生值用 @computed_field,而不是手动重复存储。
- 按应用检查清单逐项确认:定义清晰类型模型和约束、实现自定义业务验证、优雅处理 ValidationError、按 API/DB/日志选择序列化、配置 frozen/validate_assignment 等、写全面测试、用描述和示例文档化、用 BaseSettings 管理配置、优化高吞吐、遵循 PII 安全最佳实践。
- 参考 Pydantic V2 文档、Pydantic Settings、FastAPI Integration、V1 到 V2 迁移指南和性能提示来补全实现细节。
适用边界 · 注意事项
- 当项目不是 Python 或无法安装 Pydantic V2、pydantic-settings、email-validator、python-dotenv 时,不应照搬这些 V2 语法和配置。
- 当追求零依赖、纯标准库或极轻量脚本时,引入 Pydantic 验证会增加依赖和维护成本,不适合强行使用。
- 当数据完全可信且无校验、序列化、配置管理需求时,不必为了使用而使用。