大家好,我是Java1234_小锋老师,最近更新《2027版 一天学会 FastAPI Python web开发 视频教程(无废话版)》专辑,感谢大家支持。
本课程主要介绍和讲解FastAPI简介,HelloWorld实现,自动生成交互式API文档,路径参数,查询参数,请求体,参数校验,响应模型,表单数据和模型,中间件,依赖注入,集成SQLAlchemy ORM 操作数据库,集成Pydantic数据校验等
视频教程+课件+源码打包下载:
链接:https://pan.baidu.com/s/1_NzaNr0Wln6kv1rdiQnUTg
提取码:0000
参数校验(Path&Query&Field)
我们基于前面给出的三个示例,详细讲解FastAPI 参数校验,并分别针对路径参数、查询参数和请求体,展示如何使用Path、Query和Field进行额外约束和校验。
常见校验参数一览
| 参数名 | 适用对象 | 作用 |
|---|---|---|
gt/ge | 数字 | 大于 / 大于等于 |
lt/le | 数字 | 小于 / 小于等于 |
min_length/max_length | 字符串 | 字符串长度范围 |
regex | 字符串 | 正则表达式匹配 |
min_items/max_items | 列表 | 列表元素个数 |
...(省略号) | 所有 | 表示该字段必须提供(无默认值) |
default | 所有 | 设置默认值 |
title/description | 所有 | 用于生成 API 文档 |
路径参数(Path Parameters)—— 使用Path
路径参数是 URL 中必需的一部分,比如/users/{user_id}。默认情况下,FastAPI 会根据类型注解进行简单类型转换(如int),但我们可以借助Path增加校验规则,例如:
限定数值范围(
gt、ge、lt、le)设置描述信息(用于 OpenAPI 文档)
甚至使用正则表达式(
regex)校验字符串路径参数(不过路径参数通常是数字或短字符串)
我们看下实例:
from fastapi import FastAPI, Path app = FastAPI() @app.get("/users/{user_id}") async def get_user( user_id: int = Path(..., title="用户ID", description="必须是正整数", gt=0, le=1000) ): """路径参数:必须提供,且为正整数,范围 1~1000""" return {"user_id": user_id, "name": f"用户_{user_id}"}然后打开浏览器访问http://127.0.0.1:8000/docs,进行测试:如果输入范围不对,就会报错
查询参数(Query Parameters)—— 使用Query
查询参数是 URL 中?后面的键值对,通常是可选的,也可以设置默认值。用Query可以:
设置默认值(当然直接赋值也可)
校验最大/最小值、字符串长度
使用
regex校验字符串格式设置
deprecated等
我们看一个示例:
from fastapi import FastAPI, Query app = FastAPI() @app.get("/items") async def list_item( skip: int = Query(0, title="跳过条数", ge=0, description="必须 ≥0"), limit: int = Query(10, title="返回条数", ge=1, le=100, description="1~100 之间") ): """查询参数:可选,带默认值和校验""" return {"skip": skip, "limit": limit, "items": ["item1", "item2"]}然后打开浏览器访问http://127.0.0.1:8000/docs,进行测试:如果输入范围不对,就会报错
请求体(Request Body)—— 使用 Pydantic +Field
请求体通常使用 Pydantic 的BaseModel定义结构,并在字段上使用Field添加校验:
必填/可选(通过默认值控制)
字符串长度(
min_length、max_length)数值范围(
gt、ge、lt、le)正则匹配(
regex)描述信息等
我们看一个实例:
from fastapi import FastAPI from pydantic import BaseModel, Field app = FastAPI() class ItemCreate(BaseModel): name: str = Field(..., title="物品名称", min_length=2, max_length=50, description="2~50个字符") price: float = Field(..., title="价格", gt=0, le=9999.99, description="必须大于0,最多9999.99") # 可增加可选字段 description: str = Field(None, max_length=200, description="可选描述,最长200字符") @app.post("/items") async def create_item(item: ItemCreate): """请求体参数:POST 时传入 JSON,所有字段经过校验""" return {"message": "Item created", "item": item}然后打开浏览器访问http://127.0.0.1:8000/docs,进行测试:如果输入字符个数范围不对,就会报错