侧边栏壁纸
  • 累计撰写 69 篇文章
  • 累计创建 54 个标签
  • 累计收到 108 条评论

目 录CONTENT

文章目录

FastAPI从入门到实战(4)——路径参数与数值校验

MinChess
2022-11-27 / 0 评论 / 0 点赞 / 664 阅读 / 1,270 字 / 正在检测是否收录...

简单记录路径参数的类型,错误检查,自动填充,数据转换、解析、验证(包括数字大小范围的验证),参数别名,API 交互文档中传参演示等内容

一个伪静态请求

@app01.get("/stu01/parameters")
def path_params01():
    return {"message": "This is a message"}

一个普通的请求,直接请求对应的URL即可能得到响应结果,其url是固定的。

声明路径参数

@app01.get("/stu01/{str}")
def path_param02(str):
    return {"message":str}

利用{}来声明路径参数或变量,上面的str的值会被作为参数传给下面的函数并返回。

image-20221124180024510

声明有类型的路径参数

@app01.get("/stu01_typing/{parameters}")
def path_param03(parameters:str): # 函数的顺序就是路由的顺序
    return {"message":parameters}

这个例子中,parameters被声明为str类型;

如果不是规定类型,就会报错,这也就是fastapi的数据校验功能的先进之处;

image-20221124181020809

声明一个枚举类型的路径参数

from enum import Enum

# 定义一个类
class animal_cates(str,Enum):
    Dog = "狗 泰迪"
    Cat = "猫 加菲"

# 枚举类型参数
@app01.get("/stu01animal/{animal}")
async def animal_cate(animal:animal_cates):
    if animal == animal_cates.Cat:
        return {"animal_cates":animal,"number":20}
    if animal == animal_cates.Dog:
        return {"animal_cates":animal,"number":12}
    return {"animal_cates":animal,"number":"unknown"}

导入Enum并创建一个继承自strEnum的子类animal_cates

同时创建一个带有类型提示的路径参数,参数类型为animal_cates,同时进行枚举成员的比较、获取与返回。

image-20221124182746473

传递文件路径参数

# 文件路径参数(路径转换器)
@app01.get("/stu01/files/{file_path:path}")
def filepath(file_path:str):
    return f"The file path is {file_path}"

在这种情况下,参数的名称为 file_path,结尾部分的 :path 说明该参数应匹配任意的路径。

image-20221124182937166

路径参数获取

首先从fastapi 导入 Path包,再根据需求声明约束:

from fastapi import Path

# 长度和正则表达式的验证
@app01.get("/stu01_num/{number}")
def path_params_validate(
    number: int = Path(..., title="你要传的数字", description="不可描述", ge=1, le=10),
):
    return number

上面代码传入number参数并进行校验,最小为1,最大为10;

路径参数总是必需的,因为它必须是路径的一部分。所以,在声明时使用 ... 将其标记为必需参数。即使使用 None 声明路径参数或设置一个其他默认值也不会有任何影响,它依然会是必需参数。

image-20221124183406321

元数据

  • title:指定参数的标题,用做提示

image-20221124183622323

  • description:参数描述

image-20221124183641298

  • alias:别名参数

这里有个坑,要是不清楚alias的作用,入坑可能性太大了,如下:

image-20221125173150419

直接请求的话,就会报value_error.missing的错,它压根就不是起个别名那么简单;

一般是用在查询参数内,有一些变量urlpython写法不一样的时候用到的,比如减号和下划线

  • deprecated:弃用参数

image-20221125014805000

数值校验

  • gt:大于(greater than)
  • ge:大于等于(greater than or equal)
  • lt:小于(less than)
  • le:小于等于(less than or equal)

number: int = Path(..., title="你要传的数字", description="不可描述", ge=1, le=10)

  • 更多的参看源码
def Path(  # noqa: N802
    default: Any = Undefined,
    *,
    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,
    include_in_schema: bool = True,
    **extra: Any,
)

源码

# -*- coding: utf-8 -*-
# @Time: 2022/11/24 16:24
# @Author: MinChess
# @File: stu01.py
# @Software: PyCharm

from fastapi import APIRouter,Path
from enum import Enum

app01 = APIRouter()


@app01.get("/stu01/parameters")
def path_params01():
    return {"message": "This is a message"}

@app01.get("/stu01/{str}")
def path_param02(str):
    return {"message":str}

@app01.get("/stu01_typing/{parameters}")
def path_param03(parameters:str): # 函数的顺序就是路由的顺序
    return {"message":parameters}

# 定义一个类
class animal_cates(str,Enum):
    Dog = "狗 泰迪"
    Cat = "猫 加菲"

# 枚举类型参数
@app01.get("/stu01animal/{animal}")
async def animal_cate(animal:animal_cates):
    if animal == animal_cates.Cat:
        return {"animal_cates":animal,"number":20}
    if animal == animal_cates.Dog:
        return {"animal_cates":animal,"number":12}
    return {"animal_cates":animal,"number":"unknown"}

# 文件路径参数(路径转换器)
# 在这种情况下,参数的名称为 file_path,结尾部分的 :path 说明该参数应匹配任意的路径。
@app01.get("/stu01/files/{file_path:path}")
def filepath(file_path:str):
    return f"你传的文件路径为: {file_path}"


# 长度和正则表达式的验证
@app01.get("/stu01_num/{number}")
def path_params_validate(
    number: int = Path(..., title="你要传的数字", description="传递的数字描述", ge=1, le=10),
):
    return number
0

评论区