FastAPI 路径参数、查询参数、请求体、路由分配实战学习心得
FastAPI 路径参数、查询参数、请求体实战学习心得FastAPI 路径参数、查询参数、请求体实战学习心得FastAPI 的路径参数、查询参数、请求体校验核心用法彻底理清了 FastAPI 接口参数校验的核心逻辑从基础路由定义到参数规则约束再到完整请求体接收形成了一套清晰的接口开发思路收获非常大。核心知识点三类参数 四大工具这是本次学习最核心的总结也是 FastAPI 接口开发的基石直接区分清楚用法再也不会混淆第一部分FastAPI 核心四件套BaseModel / Field / Path / QueryPath作用给 URL 路径参数加校验路径参数/users/123、/news/5必须写在 URL {} 里通常是必填参数user_router.get(/news/{news_id})asyncdefget_news_id(news_id:intPath(...,title新闻分类ID,ge1,le100)):return{新闻分类id:news_id}必填字段name:strField(...)三个点 … 代表必须传不能为空Query作用给 URL 查询参数加校验查询参数/users/?bookseek?book_typePythonprice88支持默认值、选填、范围、长度校验user_router.post(/bookseek)asyncdefbook_seek(book_type:strQuery(Python分类,min_length5,max_length255),price:intQuery(ge50,le100)):print(f图书类型:{book_type},价格:{price})return{图书类型:book_type,价格:price}BaseModel用于 POST / PUT 等需要提交大量数据的接口把前端传来的 JSON 自动转换成对象定义一个用户模型继承BaseModel规定“用户”这个数据必须长什么样接收整个 JSON 请求体Field作用给模型里的字段加校验只能用在 BaseModel 模型内部限制长度、范围、正则、必填 / 选填、描述等classBook(BaseModel):book_name:strField(...,min_length2,max_length20)Author:strField(...,min_length2,max_length10)Publish:strField(default飞思出版社)price:floatField(...,ge1)工具作用参数位置BaseModel用来做整个请求体JSON的数据模型POST 请求体 BodyField给模型里面的字段添加校验规则BaseModel 类内部字段Path给 URL 路径参数添加校验/user/123路由路径{}中的参数Query给 URL 查询参数添加校验?namexxagexx网址?后面的参数路由核心基础1.将前端发起的 HTTP请求GET/POST等 与后端定义的 处理函数 绑定用户访问指定URL时自动执行对应的函数并返回结果。核心公式URL路径 HTTP方法 → 处理函数fromfastapiimportAPIRouter# 1. 初始化路由实例可指定前缀、标签方便接口分组user_routerAPIRouter(prefix/user,# 可选所有路由路径前自动添加前缀简化写法tags[用户相关接口]# 可选接口文档分组更清晰)# 2. 定义路由通过装饰器绑定user_router.get(/info)# HTTP方法 路径asyncdefget_user_info():return{msg:获取用户信息成功}2.在实际开发中为了避免代码臃肿、实现解耦我们通常会将** 主函数入口文件与 路由、模型、业务逻辑 分放在不同文件中**。核心思路是在路由文件中定义路由实例在主函数文件中导入路由并注册实现路由与入口的分离在路由文件中定义路由实例fromfastapiimportAPIRouter,Path,Queryfromwork.bodyimportBook# 导入已有的Book模型# 1. 初始化路由实例user_routerAPIRouter()# 2. 定义具体接口user_router.get(/users/{id}/{name})asyncdefget_name(id:int,name:str):return{id:id,name:name}user_router.get(/news/{news_id})asyncdefget_news_id(news_id:intPath(...,title新闻分类ID,ge1,le100)):return{新闻分类id:news_id}# 可新增图书相关路由到book_router.pybook_routerAPIRouter()book_router.post(/bookseek)asyncdefbook_seek(book_type:strQuery(Python分类,min_length5,max_length255),price:intQuery(ge50,le100)):print(f图书类型:{book_type},价格:{price})return{图书类型:book_type,价格:price}book_router.post(/book_system)asyncdefBook_Add(book:Book):print(book)return{flag:True,msg:添加成功}在主函数文件main.py中导入并注册路由# main.py主函数入口fromfastapiimportFastAPI# 导入routes目录下的所有路由实例fromroutes.user_routerimportuser_routerfromroutes.book_routerimportbook_router# 1. 创建FastAPI实例核心入口appFastAPI()# 2. 注册路由关键步骤将分文件的路由挂载到主实例上app.include_router(user_router,prefix/user,tags[用户管理])# 注册用户路由app.include_router(book_router,prefix/user,tags[图书管理])# 注册图书路由# 3. 启动服务if__name____main__:importuvicorn uvicorn.run(main:app,host127.0.0.1,port9999,reloadTrue)关键注意事项必看路由导入路径要正确主文件main.py导入路由时需确保路径正确如 from routes.user_router import user_router若提示“模块找不到”检查目录结构和导入路径是否匹配。路由实例命名唯一不同路由文件中的路由实例如user_router、book_router不能重名否则导入时会覆盖。