fastapi2
我们继续用费曼学习法,从基础用法进阶到生产环境高频使用的FastAPI核心能力,全程保持「大白话类比→概念拆解→可直接运行的完整代码→一步到位的验证方式」的节奏,所有代码都可以直接复制到之前的main.py中运行,无需额外复杂配置。
一、进阶参数校验:给你的接口加“严格安检”
大白话类比
之前我们只是检查客人提交的东西“是不是数字/字符串”(基础类型校验),现在我们要升级安检规则:
- 手机号必须是11位合规格式
- 用户名不能少于2位、不能超过20位
- 商品价格不能是负数
- 密码必须符合安全规范
FastAPI 提供了Query(查询参数校验)、Path(路径参数校验),配合 Pydantic 的Field(请求体字段校验),可以实现任意粒度的参数规则校验,所有规则还会自动同步到API文档里,无需手动编写。
核心概念解释
Path:专门给路径参数加校验规则,比如限制数字范围、必填约束、文档描述Query:专门给查询参数加校验规则,比如限制字符串长度、正则匹配、是否必填Field:给Pydantic模型(请求体/响应体)的字段加校验规则,用法和上述两个完全一致
可执行代码
fromfastapiimportFastAPI,Path,QueryfrompydanticimportBaseModel,Field# Field 用于请求体字段校验app=FastAPI()# 1. 路径参数进阶校验@app.get("/items/{item_id}")asyncdefread_item(# Path:路径参数item_id,必须大于等于1、小于等于100,规则自动同步到文档item_id:int=Path(title="物品ID",ge=1,le=100,description="物品的唯一ID,合法范围1-100")):return{"item_id":item_id,"message":"路径参数校验通过"}# 2. 查询参数进阶校验@app.get("/users/")asyncdefread_users(# Query:用户名必填,长度2-20位;年龄可选,18-100岁;手机号必须符合正则username:str=Query(min_length=2,max_length=20,description="用户名,2-20位字符"),age:int|None=Query(default=None,ge=18,le=100,description="年龄,合法范围18-100岁"),phone:str|None=Query(default=None,regex=r"^1[3-9]\d{9}$",description="11位国内手机号")):return{"username":username,"age":age,"phone":phone,"message":"查询参数校验通过"}# 3. 请求体字段进阶校验(Field)classUserCreate(BaseModel):username:str=Field(min_length=2,max_length=20,description="用户名")password:str=Field(min_length=8,description="密码至少8位")age:int=Field(ge=18,le=100,description="年龄18-100岁")email:str=Field(regex=r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$",description="合法邮箱地址")@app.post("/users/")asyncdefcreate_user(user:UserCreate):# exclude={"password"} :返回结果中排除密码字段,避免敏感信息泄露return{"message":"用户创建成功","user":user.dict(exclude={"password"})}验证方式
- 运行服务:
uvicorn main:app --reload,打开交互式文档http://127.0.0.1:8000/docs - 测试
/items/{item_id}:- 输入
item_id=0或101,会直接返回422校验错
- 输入
