FastAPI请求系列(一) 路径参数与数值校验

一、基本使用

1、基本路径参数

如下:

from fastapi import FastAPI

app = FastAPI()


@app.get("/item/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}

上面黄色部分包含路径、操作,其中:

  • /item/{item_id}   被称为路径
  • get 被称为操作,表示一种HTTP的方法(比如,POST/PUT/DELETE等)

{item_id}作为路径中的参数,其值将作为参数item_id传递给函数。

  在函数中标明了路径参数应该接受什么类型的参数,这种类型的声明会进行数据校验,比如输入不符合的参数值:

{
  "detail": [
    {
      "loc": [
        "path",
        "item_id"
      ],
      "msg": "value is not a valid integer",
      "type": "type_error.integer"
    }
  ]
}

会出现错误的提示信息,包括出错的位置信息等。

2、路径顺序

如果有多个路径时,注意它们的顺序,因为请求是按照顺序来进行匹配的,比如:

from fastapi import FastAPI

app = FastAPI()

@app.get("/path/parameters")
def path_params_1():
    return {"message":"This is path_params_1"}

@app.get("/path/{parameters}")
def path_params_2(parameters:str):
    return {"message":parameters}

上面的两个接口,如果调用第二个接口,并且传入的值为parameters,那么就会匹配到第一个接口,所以在开发中注意调整接口的顺序。

3、枚举值

显然上述的参数都是自己来进行输入的,至于输入什么接口是无从得知的,那么枚举值就是用来进行值的预设。

from fastapi import FastAPI
from enum import Enum

app = FastAPI()

class CityName(str,Enum):
    Xian = "Xian china"
    Shanghai = "Shanghai china"

@app.get("/enum/{city}")
async def city_info(city:CityName):
    if city == CityName.Xian:
        return {"info":city}
    if  city == CityName.Shanghai:
        return {"info":city}

上述中实现预设值:

  • 定义你需要给接口的预设值的类
  • 使用定义的枚举类创建类型标注的路径参数

这样交互式文档中就有预设值:

4、包含路径的路径参数 

当路径参数传递的是一个路径时,FastAPI又如何解析呢?比如上传文件的路径。

from fastapi import FastAPI

# 包含路径
@app.get("/file/{file_path:path}")
async def read_file(file_path:str):
    return {"file_path":file_path}

可以通过路径转换器,在file_path这个路径参数后面通过:path来指明匹配的是任意路径。

二、进阶

上面对路径参数的校验是通过简单的类型校验,如果想进行更为复杂的校验需要用到Path 模块。

from fastapi import FastAPI
from fastapi import Path

app = FastAPI()

@app.get("/path/{num}")
def path_params_validate(
        num:int = Path(...,title="input your num",description="description num",ge=1,le=5 ) 
):
    return num

路径参数是路径的一部分,所以它是必需的,通过"..."将其标记为必需参数,即使默认值给的是None依然是必需参数。可以通过查看Path方法查看传递的更多参数:

class Path(Param):
    in_ = ParamTypes.path

    def __init__(
        self,
        default: Any,
        *,
        alias: Optional[str] = None,
        title: Optional[str] = None,
        description: Optional[str] = None,
        gt: Optional[float] = None,
        ge: Optional[float] = None,
        lt: Optional[float] = None,
        le: Optional[float] = None,
        min_length: Optional[int] = None,
        max_length: Optional[int] = None,
        regex: Optional[str] = None,
        example: Any = Undefined,
        examples: Optional[Dict[str, Any]] = None,
        deprecated: Optional[bool] = None,
        **extra: Any,
    ):
...
...

可以看到里面的验证参数很全,除了常用的一些,另外还可以通过正则进行验证。

作者:iveBoy
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/shenjianping/p/14841743.html