【Python】Web框架 FastAPI 详解

📅 2026/7/28 9:38:03
【Python】Web框架 FastAPI 详解
1、入门FastAPI 基于 HTTP 标准方法定义接口是Python中最火的Web框架入门用法Hello World参见博客【Python】Web框架FastAPI 内部是 Starlette 和 Pydantic 外加类型提示StarletteWeb 异步网络框架管请求、路由、HTTP 流程Pydantic数据校验、类型解析库管参数、JSON 校验、数据转换Uvicorn(ASGI服务器)↓ Starlette网络层请求分发、路由、中间件、websocket ↓ FastAPI胶水层接收请求后调用Pydantic校验所有参数 ↓ Pydantic数据层校验路径参数、查询参数、POST请求体2、基本请求方式FastAPI 使用 Python 语法糖 比如下面的示例先用 app.get 装饰器工厂返回装饰器函数然后使用装饰下面的函数1GET 查询数据fromfastapiimportFastAPI appFastAPI()app.get(/items/{item_id})defread_item(item_id:int):return{id:item_id}2POST 提交数据app.post(/items)defcreate_item(name:str):return{msg:创建成功,name:name}3PUT 更新全部数据app.put(/items/{item_id})defupdate_item(item_id:int):return{msg:全量更新}4PATCH 更新部分数据app.patch(/items/{item_id})defpatch_item(item_id:int):return{msg:局部更新}5DELETE 删除数据app.delete(/items/{item_id})defdel_item(item_id:int):return{msg:删除成功}3、静态资源StaticFiles 是 StarletteFastAPI 底层 Web 框架 内置组件专门用来托管静态资源文件让浏览器可以通过 HTTP 地址访问服务器本地磁盘上的静态文件。fromfastapiimportFastAPIfromstarlette.staticfilesimportStaticFiles appFastAPI()app.mount(/static,StaticFiles(directorystatic),namestatic)app.mount(/images,StaticFiles(directoryimages),nameimages)4、异步操作async def4.1 协程函数在 fastapi 的语法糖下面使用 async def 定义协程函数的作用内部有 await 异步操作直接在事件循环(event loop) 中运行FastAPI 整个服务跑在一个事件循环上在等待HTTP返回时前事件循环可以去服务别的请求并发能力强fromfastapiimportFastAPI appFastAPI()app.get(/items/{item_id})asyncdefread_item(item_id:int):awaitasyncio.sleep(1)return{id:item_id}如果不使用 async 协程函数普通函数会同步阻塞调用 卡死整个事件循环4.2 常用示例importhttpxfromfastapiimportAPIRouter routerAPIRouter()router.get(/weather)asyncdefget_weather():asyncwithhttpx.AsyncClient()asclient:respawaitclient.get(https://api.weather.com/today)returnresp.json()4.3 反面示例在 async def 里不能写阻塞代码比如sleep()、requests.get(url)可以使用 await run_in_threadpool() 封装起来交给线程池或者直接使用普通函数defFastAPI 会自动丢进线程池importtime,requestsrouter.get(/bad)asyncdefbad():time.sleep(3)datarequests.get(url)returndata5、全局异常处理FastAPI 接口一旦抛异常默认返回:{ detail: Internal Server Error }如果前端要求返回指定格式将无法解析使用下面的代码可以将返回格式改成{ code: 5001, msg: 具体错误信息, data: {} }classServerError(APIException):code5001msg接口错误app.exception_handler(Exception)asyncdefudf_exception_handler(request,e):ifisinstance(e,APIException):erroreelse:ifhasattr(app,logger):app.logger.exception(e)errorServerError(msgstr(e))ifhasattr(app,logger):app.logger.error(fAPI ERROR [{error.code}] :{error.msg})returnerror.jsonfyapp.exception_handler(Exception) 是全局异常兜底机制统一拦截把所有异常转换成指定的格式返回给前端也可以把错误记到日志里6、常用参数6.1 示例app.post(laoer, include_in_schemaFalse summary创建文件夹 , tags[f系统配置])控制接口在 Swagger 文档tags(标签) 给接口分组把接口归到某个分组下Swagger 文档里就会按 tag 折叠展示summary(摘要)一句话说明接口用途显示在 Swagger 文档每个接口那一行的简短标题include_in_schema(是否纳入文档)隐藏接口默认为True即接口出现在 Swagger 文档里6.2 文档展示相关参数参数类型作用descriptionstr更详细的说明response_descriptionstr对响应的说明默认是 “Successful Response”deprecatedbool标记接口已废弃Swagger 里会显示删除线和 ⚠️ 警告responsesdict自定义额外状态码的说明和模型,如 {404: {“model”: ErrorModel, “description”: “未找到”}}openapi_extradict往 OpenAPI schema 里塞自定义字段operation_idstr给接口一个唯一 ID(常用于代码生成)namestr路由的内部名字(URL 模板反向生成时用)例如app.get(f{API_PREFIX}/export,summary获取导出作业列表,description返回所有导出任务及其状态,支持按时间排序,tags[任务管理],deprecatedFalse,responses{500:{description:服务器内部错误}},)6.3 响应模型的参数参数作用response_model指定返回数据的 Pydantic 模型自动过滤多余字段response_model_exclude / response_model_include只保留某些字段response_model_by_alias是否使用模型字段的别名response_model_exclude_unset不返回没赋值的字段response_model_exclude_none不返回值为 None 的字段response_class自定义响应类如 JSONResponse、HTMLResponse、PlainTextResponsestatus_code成功时返回的 HTTP 状态码默认 200如 status_code2017、BaseModelfrompydanticimportBaseModelBaseModel 是 Pydantic 库提供的基础模型父类自定义的数据类只要继承它就自动拥有数据类型校验类型转换默认值嵌套结构JSON 序列化错误提示FastAPI 所有请求体、响应体数据解析底层全靠它实现例如下面的示例自动将json格式转换成Python对象ItemfromfastapiimportFastAPIfrompydanticimportBaseModel appFastAPI()classItem(BaseModel):name:strage:intapp.post(/items)defcreate_item(item:Item):returnitem主要作用自动解析请求体从 JSON 反序列化为 Python 对象自动数据校验 类型不对或字段缺失直接返回 422自动生成文档OpenAPI Schema 直接从类型推导自动序列化响应返回对象自动转 JSON 格式