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 的参数,如 (http://localhost: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参数验证

验证规则也可以应用于数字参数,使用下面给出的运算符 -

  • gt - 大于

  • ge - 大于或等于

  • lt - 小于

  • le - 小于或等于

让我们修改上面的操作装饰器以包含年龄作为路径参数并应用验证。

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}

在这种情况下,验证规则适用于参数名称和年龄。如果输入的 URL 是 http://localhost: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参数验证

查询参数还可以应用验证规则。您必须将它们指定为 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 是 http://localhost:8000/hello/Ravi/20?percent=79,则浏览器显示以下 JSON 响应 -

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

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

FastAPI参数验证

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