FastAPI - 参数验证



可以对 URL 的路径参数和查询参数应用验证条件。为了对路径参数应用验证条件,需要导入 Path 类。除了参数的默认值之外,在字符串参数的情况下,还可以指定最大和最小长度。

from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/hello/{name}")
async def hello(name:str=Path(...,min_length=3,
max_length=10)):
   return {"name": name}

如果浏览器 URL 中包含长度小于 3 或大于 10 的参数,例如 (https://127.0.0.1:8000/hello/Tutorialspoint),则会出现相应的错误消息,例如:

{
   "detail": [
      {
         "loc": [
            "path",
            "name"
         ],
         "msg": "ensure this value has at most 10 characters",
         "type": "value_error.any_str.max_length",
         "ctx": {
            "limit_value": 10
         }
      }
   ]
}

OpenAPI 文档也显示了应用的验证:

FastAPI Parameter Validation

验证规则也可以应用于数值参数,使用以下运算符:

  • gt - 大于

  • ge - 大于或等于

  • lt - 小于

  • le - 小于或等于

让我们修改上述操作装饰器,将 age 作为路径参数并应用验证。

from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/hello/{name}/{age}")
async def hello(*, name: str=Path(...,min_length=3 , max_length=10), age: int = Path(..., ge=1, le=100)):
   return {"name": name, "age":age}

在这种情况下,对参数 name 和 age 都应用了验证规则。如果输入的 URL 为 https://127.0.0.1:8000/hello/hi/110,则 JSON 响应将显示以下验证失败说明:

{
   "detail": [
      {
         "loc": [
            "path",
            "name"
         ],
         "msg": "ensure this value has at least 3 characters",
         "type": "value_error.any_str.min_length",
         "ctx": {
            "limit_value": 3
         }
      },
      {
         "loc": [
            "path",
            "age"
         ],
         "msg": "ensure this value is less than or equal to 100",
         "type": "value_error.number.not_le",
         "ctx": {
            "limit_value": 100
         }
      }
   ]
}

Swagger UI 文档也识别了这些约束。

FastAPI Parameter Validation

查询参数也可以应用验证规则。您需要将它们指定为 Query 类构造函数的参数的一部分。

让我们在上述函数中添加一个名为percent的查询参数,并应用验证规则 ge=0(即大于或等于 0)和 lt=100(小于或等于 100)

from fastapi import FastAPI, Path, Query
@app.get("/hello/{name}/{age}")
async def hello(*, name: str=Path(...,min_length=3 ,
max_length=10), \
      age: int = Path(..., ge=1, le=100), \
      percent:float=Query(..., ge=0, le=100)):
   return {"name": name, "age":age}

如果输入的 URL 为 https://127.0.0.1:8000/hello/Ravi/20?percent=79,则浏览器将显示以下 JSON 响应:

{"name":"Ravi","age":20}

FastAPI 正确地识别了 percent 为应用了验证条件的查询参数。它在 OpenAPI 文档中反映如下:

FastAPI Parameter Validation

虽然客户端可以使用 GET 方法将路径和查询参数发送到 API 服务器,但我们需要应用 POST 方法才能将一些二进制数据作为 HTTP 请求的一部分发送。此二进制数据可以是任何 Python 类的对象形式。它构成请求体。FastAPI 使用 Pydantic 库来实现此目的。

广告