简单记录路径参数的类型,错误检查,自动填充,数据转换、解析、验证(包括数字大小范围的验证),参数别名,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
的值会被作为参数传给下面的函数并返回。
声明有类型的路径参数
@app01.get("/stu01_typing/{parameters}")
def path_param03(parameters:str): # 函数的顺序就是路由的顺序
return {"message":parameters}
这个例子中,
parameters
被声明为str
类型;如果不是规定类型,就会报错,这也就是fastapi的数据校验功能的先进之处;
声明一个枚举类型的路径参数
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
并创建一个继承自str
和Enum
的子类animal_cates
;同时创建一个带有类型提示的路径参数,参数类型为
animal_cates
,同时进行枚举成员的比较、获取与返回。
传递文件路径参数
# 文件路径参数(路径转换器)
@app01.get("/stu01/files/{file_path:path}")
def filepath(file_path:str):
return f"The file path is {file_path}"
在这种情况下,参数的名称为 file_path,结尾部分的 :path 说明该参数应匹配任意的路径。
路径参数获取
首先从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
声明路径参数或设置一个其他默认值也不会有任何影响,它依然会是必需参数。
元数据
- title:指定参数的标题,用做提示
- description:参数描述
- alias:别名参数
这里有个坑,要是不清楚alias的作用,入坑可能性太大了,如下:
直接请求的话,就会报
value_error.missing
的错,它压根就不是起个别名那么简单;一般是用在查询参数内,有一些变量
url
和python
写法不一样的时候用到的,比如减号和下划线
- deprecated:弃用参数
数值校验
- 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
评论区