前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FastAPI从入门到实战(4)——路径参数与数值校验

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

作者头像
MinChess
发布2022-12-27 19:22:53
6890
发布2022-12-27 19:22:53
举报
文章被收录于专栏:九陌斋九陌斋

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

一个伪静态请求

代码语言:javascript
复制
@app01.get("/stu01/parameters")
def path_params01():
    return {"message": "This is a message"}

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

声明路径参数

代码语言:javascript
复制
@app01.get("/stu01/{str}")
def path_param02(str):
    return {"message":str}

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

image-20221124180024510
image-20221124180024510

声明有类型的路径参数

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

这个例子中,parameters被声明为str类型; 如果不是规定类型,就会报错,这也就是fastapi的数据校验功能的先进之处;

image-20221124181020809
image-20221124181020809

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

代码语言:javascript
复制
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
image-20221124182746473

传递文件路径参数

代码语言:javascript
复制
# 文件路径参数(路径转换器)
@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
image-20221124182937166

路径参数获取

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

代码语言:javascript
复制
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
image-20221124183406321

元数据

  • title:指定参数的标题,用做提示
image-20221124183622323
image-20221124183622323
  • description:参数描述
image-20221124183641298
image-20221124183641298
  • alias:别名参数

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

image-20221125173150419
image-20221125173150419

直接请求的话,就会报value_error.missing的错,它压根就不是起个别名那么简单; 一般是用在查询参数内,有一些变量urlpython写法不一样的时候用到的,比如减号和下划线

  • deprecated:弃用参数
image-20221125014805000
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)

  • 更多的参看源码
代码语言:javascript
复制
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,
)

源码

代码语言:javascript
复制
# -*- 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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一个伪静态请求
  • 声明路径参数
  • 声明有类型的路径参数
  • 声明一个枚举类型的路径参数
  • 传递文件路径参数
  • 路径参数获取
    • 元数据
    • 数值校验
    • 源码
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档