Fastapi 简明教程

FastAPI - Parameter Validation

可以在 URL 的路径参数以及查询参数中应用 validation conditions 。要对路径参数应用验证条件,您需要导入 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 的参数(如 ([role="bare"] [role="bare"]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 文档还显示应用的验证 −

valid1

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

  1. gt − greater than

  2. ge − 大于或等于

  3. lt − less than

  4. 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}

在这种情况下,验证规则应用于 name 和 age 这两个参数。如果输入的 URL 是 [role="bare"] [role="bare"]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 文档也会识别这些约束。

valid2

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

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

FastAPI 正确地将 percent 识别为带验证条件的查询参数。它反映在 OpenAPI 文档中,如下所示 −

valid3

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