FastAPI筑基_Day8_参数高级校验精讲
【FastAPI筑基-Day8】参数高级校验精讲Path/Query/Body长度/范围/正则/自定义报错工业级接口规范专栏FastAPI 零基础后端实战系列标签FastAPI、参数校验、Query、Path、Body、Pydantic、后端接口规范前置学习Day7 三大传参方式、Day5 Pydantic 基础校验一、前言通过 Day7 的学习我们已经能写 GET、POST 接口接收路径参数、查询参数、Body 请求体参数。但是普通参数只能校验类型内容却毫无限制年龄可以传-999手机号可以传12345用户名可以传 100 个字符分页参数可以传 0、负数每个接口手动写 if 判断代码又臭又长还容易漏。本文说了什么FastAPI 内置的四大校验工具——Path、Query、Body、Field实现工业级参数精细化校验。实现了什么一个包含路径参数校验、查询参数分页校验、请求体模型校验、正则校验、自定义错误提示的完整可运行项目。目的是什么学完再也不用手写 if 校验参数FastAPI 自动拦截非法参数、自动返回标准错误信息接口质量直接达到企业生产级规范。二、核心四大校验工具FastAPI 的参数校验全部基于 Pydantic共四个工具各司其职fromfastapiimportPath,Query,BodyfrompydanticimportField工具作用适用场景Path路径参数校验ID、编号必须为正数Query查询参数校验分页、搜索、过滤条件Body单个 Body 参数校验简单请求体字段FieldPydantic 模型字段校验最常用配合 BaseModel 使用学完这个你就能体会到什么叫声明式校验——你只管声明规则验证交给框架。三、路径参数 Path 高级校验路径参数最常见的场景是用户 ID、文章 ID、订单号要求必须是正整数且在一定范围内。常用参数参数含义ge大于等于greater or equalle小于等于less or equalgt大于greater thanlt小于less thandescription参数说明文档代码示例fromfastapiimportFastAPI,Path appFastAPI(titleDay8 Path 参数校验)app.get(/user/{user_id})defget_user(user_id:intPath(...,ge1,le99999,description用户ID正整数),):return{user_id:user_id,msg:查询成功}...表示必填参数ge1限制最小值为 1le99999限制最大值为 99999。运行验证 合法用户ID GET /user/100 → {user_id:100,msg:查询成功} 非法用户ID (0) GET /user/0 → {code:400,msg:参数错误Input should be greater than or equal to 1} 非法用户ID (-10) GET /user/-10 → {code:400,msg:参数错误Input should be greater than or equal to 1}传 0 或负数直接被拦截不需要写一行if user_id 0。四、查询参数 Query 高级校验分页/搜索专用项目中分页、搜索、关键字筛选全部用 Query 校验。支持字符串长度、数字范围、默认值、必填。代码示例fromfastapiimportQueryapp.get(/user/list)deflist_user(page:intQuery(1,ge1,description页码),size:intQuery(10,ge1,le100,description每页数量),keyword:strQuery(,max_length20,description搜索关键字),):return{page:page,size:size,keyword:keyword}三个参数的校验规则一目了然page默认第 1 页最小 1无上限size默认每页 10 条限制 1~100防止一次性请求过多数据keyword默认为空最长 20 字符运行验证 合法查询 GET /user/list?page2size20keywordadmin → {page:2,size:20,keyword:admin} 非法 size200 GET /user/list?size200 → {code:400,msg:参数错误Input should be less than or equal to 100} 超长关键字 GET /user/list?keywordaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa → {code:400,msg:参数错误String should have at most 20 characters}分页参数校验是后端防恶意请求的第一道防线size限 100 条再大的数据量用游标分页。五、请求体 Body Field 精细化校验POST 核心业务中 90% 的参数校验都在这里用户名、密码、年龄、手机号……全部通过 Pydantic 模型统一管理。代码示例frompydanticimportBaseModel,FieldclassRegisterModel(BaseModel):username:strField(...,min_length2,max_length10)password:strField(...,min_length6,max_length16)age:intField(18,ge0,le120)phone:strField(...,patternr^1[3-9]\d{9}$)app.post(/register)defregister(data:RegisterModel):return{code:200,msg:注册成功,data:data.model_dump()}运行验证 合法注册 POST /register {username:admin,password:123456,age:18,phone:13800138000} → {code:200,msg:注册成功,data:{username:admin,password:123456,age:18,phone:13800138000}} 非法手机号 POST /register {username:admin,password:123456,phone:12345} → {code:400,msg:参数错误String should match pattern ^1[3-9]\\d{9}$} 用户名太短 POST /register {username:a,password:123456,phone:13800138000} → {code:400,msg:参数错误String should have at least 2 characters}手机号正则^1[3-9]\d{9}$匹配 11 位以 1 开头、第二位 3~9 的中国手机号非法格式直接拒绝。六、正则表达式校验手机号/邮箱/账号正则校验是 Field 的杀手级功能手机号、邮箱、账号格式全靠它。frompydanticimportBaseModel,FieldclassUserModel(BaseModel):phone:strField(...,patternr^1[3-9]\d{9}$,description手机号)email:strField(...,patternr^\w\w\.\w$,description邮箱)在 Pydantic v2 中参数名是patternv1 中是regex注意区分。七、必填参数与可选参数写法必填使用...Ellipsisusername:strField(...,min_length2)可选可空使用None作为默认值city:str|NoneField(None,max_length20)注意str | None语法要求 Python 3.10老版本用Optional[str]。八、自定义错误提示企业级必备默认的校验错误信息是英文的前端同学看不懂。我们可以用异常处理器统一替换为中文提示fromfastapiimportFastAPIfromfastapi.exceptionsimportRequestValidationErrorfromfastapi.responsesimportJSONResponse appFastAPI()app.exception_handler(RequestValidationError)asyncdefvalidation_exception_handler(request,exc):msgexc.errors()[0][msg]returnJSONResponse(status_code400,content{code:400,msg:参数错误msg})加上这段代码后所有参数校验错误统一返回{code: 400, msg: 参数错误...}前端拿到的永远是标准格式直接展示给用户即可。九、Day8 完整可运行代码FastAPI筑基 Day8 参数高级校验 —— 配套可运行代码fromfastapiimportFastAPI,Path,Queryfromfastapi.exceptionsimportRequestValidationErrorfromfastapi.responsesimportJSONResponsefrompydanticimportBaseModel,Field appFastAPI(titleDay8 参数高级校验)app.exception_handler(RequestValidationError)asyncdefvalidation_exception_handler(request,exc):msgexc.errors()[0][msg]returnJSONResponse(status_code400,content{code:400,msg:参数错误msg})app.get(/user/list)defdemo2_query_param(page:intQuery(1,ge1,description页码),size:intQuery(10,ge1,le100,description每页数量),keyword:strQuery(,max_length20,description搜索关键字),):return{page:page,size:size,keyword:keyword}app.get(/user/{user_id})defdemo1_path_param(user_id:intPath(...,ge1,le99999,description用户ID),):return{user_id:user_id,msg:查询成功}classRegisterModel(BaseModel):username:strField(...,min_length2,max_length10)password:strField(...,min_length6,max_length16)age:intField(18,ge0,le120)phone:strField(...,patternr^1[3-9]\d{9}$)app.post(/register)defdemo3_body_field(data:RegisterModel):return{code:200,msg:注册成功,data:data.model_dump()}if__name____main__:importuvicorn uvicorn.run(app,host127.0.0.1,port8000)注意/user/list和/user/{user_id}两个路由必须把list放在{user_id}前面否则/user/list会被{user_id}匹配为 id“list” 导致校验失败。这是 FastAPI 路由按定义顺序匹配的特性。运行方式pipinstallfastapi uvicorn pydantic python3 day8.py打开http://127.0.0.1:8000/docs自动生成 Swagger 接口文档在线测试校验效果。实际运行结果 1. 合法用户ID GET /user/100 → {user_id:100,msg:查询成功} 2. 非法用户ID (0) GET /user/0 → {code:400,msg:参数错误Input should be greater than or equal to 1} 3. 非法用户ID (-10) GET /user/-10 → {code:400,msg:参数错误Input should be greater than or equal to 1} 4. 合法查询参数 GET /user/list?page2size20keywordadmin → {page:2,size:20,keyword:admin} 5. 非法 size200 GET /user/list?size200 → {code:400,msg:参数错误Input should be less than or equal to 100} 6. 超长关键字 GET /user/list?keywordaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa → {code:400,msg:参数错误String should have at most 20 characters} 7. 合法注册 POST /register {username:admin,password:123456,age:18,phone:13800138000} → {code:200,msg:注册成功,data:{username:admin,password:123456,age:18,phone:13800138000}} 8. 非法手机号 POST /register {username:admin,password:123456,phone:12345} → {code:400,msg:参数错误String should match pattern ^1[3-9]\\d{9}$} 9. 用户名太短 POST /register {username:a,password:123456,phone:13800138000} → {code:400,msg:参数错误String should have at least 2 characters}十、Day8 核心知识点总结知识点说明Path路径参数校验ge/le限制数字范围必填参数用...Query查询参数校验分页、搜索参数max_length限制字符串长度Field模型字段校验min_length/max_length/pattern最常用正则pattern手机号、邮箱、账号格式校验必填 vs 可选...必填None可选自定义错误提示重写RequestValidationError异常处理器至此你的接口已经达到企业生产级规范——参数校验、自动文档、中文错误提示全套齐活。十一、下期预告Day9FastAPI 静态文件 跨域 CORS 配置解决前端跨域报错、托管图片/js/css 文件彻底打通前后端联调无障碍

相关新闻

从手动改稿到AI秒出:2026年横评6款PPT生成工具,技术方案与项目交付场景实测

从手动改稿到AI秒出:2026年横评6款PPT生成工具,技术方案与项目交付场景实测

做项目交付PPT时,你可能遇到过这些情况:熬了几个通宵,拼凑出来的技术方案,客户却说“模板太花哨,不符合我们公司规范”;竞品分析报告里的截图,想复用里面的图表,只能对着屏幕一笔一笔…

2026/9/26 8:29:22 阅读更多 →
WSL Root权限管理与系统快照实战指南

WSL Root权限管理与系统快照实战指南

1. WSL环境下的Root权限管理实战在Windows Subsystem for Linux(WSL)的日常使用中,Root权限管理是个高频需求场景。不同于传统Linux系统,WSL的用户体系与Windows存在特殊关联,这导致许多开发者会遇到以下典型问题&…

2026/9/30 6:07:35 阅读更多 →
SSH配置管理器:集中管理多服务器连接,无缝集成Wezterm等终端工具

SSH配置管理器:集中管理多服务器连接,无缝集成Wezterm等终端工具

如果你经常需要连接多台服务器,每次手动输入ssh userhost -p port不仅繁琐,还容易记错。今天介绍一个开源项目:SSH配置管理器。它的核心价值不是替代终端,而是帮你统一管理所有SSH连接配置,并一键调用你喜欢的终端工具…

2026/9/28 22:49:01 阅读更多 →

最新新闻

VMware中Ubuntu 22.04虚拟机磁盘扩容完整指南:从分区到LVM一步到位

VMware中Ubuntu 22.04虚拟机磁盘扩容完整指南:从分区到LVM一步到位

不知道你有没有遇到过这种情况:VMware里装了个Ubuntu 22.04,当时觉得自己挺有经验,硬盘随便给了20G,结果过了一两个月,编译一个大项目、拉几个Docker镜像、再装点ROS依赖,系统盘就飘红了。清理缓存、删日志…

2026/9/30 14:58:07 阅读更多 →
基于SpringBoot+Vue3的果蔬生鲜电商系统:前后端分离与JWT鉴权实战解析

基于SpringBoot+Vue3的果蔬生鲜电商系统:前后端分离与JWT鉴权实战解析

先把我做这个项目的真实感受放在最前面:没有任何一个技术项目能像果蔬生鲜电商这样,把SpringBoot和Vue3的实战价值体现得如此充分。前后端分离、JWT鉴权、商品与订单流转、后台管理……这些看上去很“教科书”的名词,落在一个卖菜平台上&…

2026/9/30 14:58:07 阅读更多 →
GEO专家孟庆涛:GEO 时代的信源布局方法论从内容优化到语境匹配

GEO专家孟庆涛:GEO 时代的信源布局方法论从内容优化到语境匹配

当 AI 的推荐随问法、语言、城市与平台漂移,品牌要优化的就不再是内容本身,而是内容与语境的匹配概率。 2026 年 9 月 7 日,Semrush 与 Exploding Topics 联合发布了一项覆盖 2338 名美国成年人的调查:73.6% 的每周 AI 使用者曾依…

2026/9/30 14:58:07 阅读更多 →
jevgrep 评测全揭秘:SWE-bench 10 任务 8/10 通过、总成本降 25.8% 的完整方法论

jevgrep 评测全揭秘:SWE-bench 10 任务 8/10 通过、总成本降 25.8% 的完整方法论

jevgrep 评测全揭秘:SWE-bench 10 任务 8/10 通过、总成本降 25.8% 的完整方法论 【免费下载链接】jevgrep Find code by asking what it does. A CLI for coding agents that uses Jev to discover relevant files and source context. 项目地址: https://gitcod…

2026/9/30 14:58:07 阅读更多 →
Django+LLM实战:网约车供需平衡预测与调度优化系统

Django+LLM实战:网约车供需平衡预测与调度优化系统

1. 选题定调:为什么偏偏是“滴滴出行供需平衡优化” 每年到了毕业设计开题季,计算机专业的同学基本都会经历一轮“选题焦虑”。尤其是想做应用型、偏数据分析方向的人,很容易被市面上五花八门的题目晃花了眼——什么“基于XX的推荐系统”“基…

2026/9/30 14:58:07 阅读更多 →
OpenStack Nova 16种核心操作全解析:从状态机到运维实战

OpenStack Nova 16种核心操作全解析:从状态机到运维实战

1. 为什么说 Nova 的操作比你想的多得多 做过 OpenStack 运维的人都有这种体会:Nova 表面上是“管虚拟机”的组件,但真正上手之后才发现,它那套操作体系的复杂度远超预期。单说对一个 instance 的管理,官方 API 文档里列出的动作就…

2026/9/30 14:57:00 阅读更多 →

日新闻

Base64 图片头部特征识别:从文件头到格式判断的完整指南

Base64 图片头部特征识别:从文件头到格式判断的完整指南

1. 项目概述:为什么说看懂 base64 图片头部是基本功这几年跟 base64 打交道的机会越来越多,后端接口返回图片、前端渲染验证码、小程序里存小图、还有一些老系统导出报表,动不动就给你一段长到怀疑人生的 base64 字符串。很多人拿到字符串就直…

2026/9/30 0:00:35 阅读更多 →
Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

简介:本资源是一份面向Java初学者与课程设计学生的公交站牌广告灯箱管理系统毕业设计文档,聚焦城市公共广告资源信息化管理痛点,提供从需求分析到技术实现的完整方案。文档采用标准学术论文结构,含摘要、英文摘要、目录及五章正文…

2026/9/30 0:00:35 阅读更多 →
用 Redis Lua 构建大模型 API 多租户原子配额治理体系

用 Redis Lua 构建大模型 API 多租户原子配额治理体系

我去年年底接了一个内部 AI 平台的治理需求,背景很直接:公司把 DeepSeek、MiniMax 这类大模型 API 统一封装成内部网关,开放给几个业务团队用。结果第一个月账单出来,额度直接超了 4 倍。仔细查日志,发现原因并不复杂—…

2026/9/30 0:00:35 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 16:41:41 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/29 19:29:29 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/29 3:55:56 阅读更多 →