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
的值会被作为参数传给下面的函数并返回。
声明有类型的路径参数
@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
相关文章
- iOS逆向入门实践 — 逆向微信,伪装定位(二)
- 分布式--Spring Security入门
- 计算机入门基础知识
- 1.Go编程快速入门学习
- fiori教程_英语入门自学方法
- producer参数---Kafka从入门到精通(七)
- pyTorch入门(四)——导出Minist模型,C++ OpenCV DNN进行识别
- 大数据Flink进阶(六):Flink入门案例
- Unity3D游戏开发入门引导:Unity3D收费方案和版本、下载地址、安装教程
- Linux TC命令入门指南(linuxtc教程)
- Linux集群搭建:从入门到精通(linux集群搭建)
- Linux脚本入门指南:从零开始学习脚本编程(linux脚本教程)
- 在Mac上使用MySQL:快速入门(mac下使用mysql)
- MySQL命令行基础操作:快速入门(mysql命令行基本操作)
- 25个字太短无法表达,以下是几个选择:1. Oracle学习笔记:我的经验分享 2. Oracle笔记:快速成为数据库专家 3. Oracle学习笔记:从入门到精通 4. Oracle数据库笔记:提高工作效率的方法 5. Oracle笔记:解决常见问题的技巧(oracle笔记)
- 教程SQL Server入门指南:最佳实践学习方案(sqlserver初级)
- 成长之路从Oracle入门到大神(oracle从入门到大神)
- ExpressJS入门实例