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

简单记录路径参数的类型,错误检查,自动填充,数据转换、解析、验证(包括数字大小范围的验证),参数别名,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

感谢阅读
博客链接:https://blog.jiumoz.com/archives/fastapi-cong-ru-men-dao-shi-zhan-lu-jing-can-shu-yu-shu-zhi-xiao-yan

欢 迎 关 注 博 主 个 人 小 程 序!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九陌斋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值