FastAPI python web开发- 参数校验(PathQueryField)

大家好,我是Java1234_小锋老师,最近更新《2027版 一天学会 FastAPI Python web开发 视频教程(无废话版)》专辑,感谢大家支持。

本课程主要介绍和讲解FastAPI简介,HelloWorld实现,自动生成交互式API文档,路径参数,查询参数,请求体,参数校验,响应模型,表单数据和模型,中间件,依赖注入,集成SQLAlchemy ORM 操作数据库,集成Pydantic数据校验等

视频教程+课件+源码打包下载:

链接:https://pan.baidu.com/s/1_NzaNr0Wln6kv1rdiQnUTg
提取码:0000

参数校验(Path&Query&Field)

我们基于前面给出的三个示例,详细讲解FastAPI 参数校验,并分别针对路径参数查询参数请求体,展示如何使用PathQueryField进行额外约束和校验。

常见校验参数一览

参数名适用对象作用
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增加校验规则,例如:

  • 限定数值范围(gtgeltle

  • 设置描述信息(用于 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_lengthmax_length

  • 数值范围(gtgeltle

  • 正则匹配(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,进行测试:如果输入字符个数范围不对,就会报错