返回

告别 constr:用自定义验证器解锁 FastAPI 字符串验证的威力

python

告别 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 异常来测试自定义验证器。