告别 constr:用自定义验证器解锁 FastAPI 字符串验证的威力
2024-03-19 19:03:16
告别 constr:在 FastAPI 中使用自定义验证器
引 言
在使用 FastAPI 和 Pydantic 的项目中,constr
一直是验证字符串的得力助手。然而,随着它的弃用,我们需要寻找一种现代的替代方案,既能保持 constr
的验证功能,又符合当前最佳实践。
自定义验证器的魅力
自定义验证器是取代 constr
的推荐方法。它允许你创建满足特定需求的验证器,并具有灵活性、可重用性和可扩展性。
创建自定义验证器
创建一个自定义验证器需要你实现 Pydantic 的 Validator
协议。下面是一个验证字符串长度和格式的示例:
from pydantic import validator, ValidationError
from typing import List, Optional
class CustomStrValidator:
@validator
def validate_string(cls, value: str) -> str:
if len(value) > 4:
raise ValidationError("String is too long")
if not value.isupper():
raise ValidationError("String is not uppercase")
return value
应用自定义验证器
要应用自定义验证器,可以使用 validator
装饰器:
from pydantic import BaseModel, Field
class Site(BaseModel):
site_code: str = Field(..., validators=[CustomStrValidator()])
在 FastAPI 中使用
自定义验证器可以在 FastAPI 中与 constr
相同的方式使用:
from fastapi import FastAPI, HTTPException
app = FastAPI()
@app.get("/{site_code}", summary="Read a site")
async def get_site(site_code: Site) -> str:
return "..."
优势一览
使用自定义验证器带来了以下优势:
- 灵活性: 可根据特定需求创建定制验证器。
- 可重用性: 可在多个模型和路由函数中重复使用。
- 可扩展性: 可创建复杂验证逻辑,包括依赖于其他字段的验证。
结论
自定义验证器是替代 constr
的首选方法,提供更大的灵活性和可扩展性。通过遵循本文中的步骤,你可以轻松地在 FastAPI 中实现自定义验证,以确保字符串输入符合你的特定约束。
常见问题解答
1. 与 constr
相比,自定义验证器有哪些缺点?
自定义验证器需要手动创建和维护,而 constr
是一个内置验证器。
2. 什么时候应该使用 constr
而不是自定义验证器?
对于简单的验证场景,constr
仍然是一个不错的选择,因为它开箱即用,易于使用。
3. 如何处理复杂或多级的验证?
自定义验证器允许你创建复杂的验证逻辑,包括依赖于其他字段的验证。
4. 可以使用自定义验证器验证非字符串数据类型吗?
是的,自定义验证器可以用于验证任何数据类型。
5. 如何测试自定义验证器?
可以使用 Pydantic 的 validate_model
函数或 ValidationError
异常来测试自定义验证器。