FastAPI 学习教程 · 第7部分
中间件、异常处理与自定义响应 本部分目标学会捕获错误并返回友好提示使用中间件记录日志、处理跨域CORS统一 API 响应格式提升应用健壮性和用户体验。一、为什么需要异常处理和中间件用户友好默认错误信息如 422对前端不友好安全性避免暴露内部错误细节可维护性统一日志、性能监控、跨域支持一致性所有接口返回相同结构的 JSONFastAPI 提供了强大的机制来实现这些需求。二、自定义异常处理器Exception Handlers2.1 捕获内置异常FastAPI 自动处理很多异常如验证失败但你可以覆盖它。示例美化 422 错误请求数据无效# main.pyfromfastapiimportFastAPI,Requestfromfastapi.responsesimportJSONResponsefromfastapi.exceptionsimportRequestValidationError appFastAPI()app.exception_handler(RequestValidationError)asyncdefvalidation_exception_handler(request:Request,exc:RequestValidationError):returnJSONResponse(status_code400,content{error:请求参数错误,details:exc.errors()}) 现在当 JSON 字段缺失或类型错误时返回{error:请求参数错误,details:[...]}2.2 捕获自定义异常步骤1定义自定义异常类# exceptions.pyclassUserNotFoundException(Exception):def__init__(self,username:str):self.usernameusername步骤2注册异常处理器# main.pyfromexceptionsimportUserNotFoundExceptionapp.exception_handler(UserNotFoundException)asyncdefuser_not_found_handler(request:Request,exc:UserNotFoundException):returnJSONResponse(status_code404,content{error:f用户{exc.username}不存在})步骤3在路由中抛出异常app.get(/users/{username})defget_user(username:str):ifusernamenotin[alice,bob]:raiseUserNotFoundException(username)return{username:username}三、中间件Middleware中间件在每个请求前后执行通用逻辑如记录请求日志添加 CORS 头允许前端跨域测量请求耗时验证全局 Token3.1 CORS 中间件必须前端如 React/Vue通常运行在不同端口浏览器会阻止跨域请求。CORSCross-Origin Resource Sharing解决这个问题。# main.pyfromfastapi.middleware.corsimportCORSMiddleware app.add_middleware(CORSMiddleware,allow_origins[*],# 允许所有来源生产环境应限制allow_credentialsTrue,allow_methods[*],# 允许所有 HTTP 方法allow_headers[*],# 允许所有请求头)⚠️ 生产环境建议allow_origins[https://your-frontend.com]3.2 自定义中间件记录请求日志importtimefromstarlette.middleware.baseimportBaseHTTPMiddlewareclassLogMiddleware(BaseHTTPMiddleware):asyncdefdispatch(self,request:Request,call_next):start_timetime.time()responseawaitcall_next(request)process_timetime.time()-start_timeprint(f请求:{request.method}{request.url}| 耗时:{process_time:.3f}s)returnresponse app.add_middleware(LogMiddleware) 启动后每次请求会打印日志到控制台。四、统一响应格式最佳实践很多团队要求所有成功响应都遵循固定结构例如{code:200,message:success,data:{...}}实现方式自定义响应模型 封装函数# schemas.pyfrompydanticimportBaseModelfromtypingimportAny,OptionalclassResponseModel(BaseModel):code:int200message:strsuccessdata:AnyNone# 工具函数defsuccess_response(data:AnyNone,message:strsuccess):returnResponseModel(datadata,messagemessage)在路由中使用app.get(/health)defhealth_check():returnsuccess_response(data{status:OK}) 你也可以通过中间件自动包装所有响应但初学者建议先用函数封装。五、完整示例代码main.py# main.pyimporttimefromfastapiimportFastAPI,Request,HTTPExceptionfromfastapi.responsesimportJSONResponsefromfastapi.exceptionsimportRequestValidationErrorfromfastapi.middleware.corsimportCORSMiddlewarefromstarlette.middleware.baseimportBaseHTTPMiddlewarefrompydanticimportBaseModelfromtypingimportAny# 自定义异常classUserNotFoundException(Exception):def__init__(self,username:str):self.usernameusername# 统一响应模型classResponseModel(BaseModel):code:int200message:strsuccessdata:AnyNonedefsuccess_response(data:AnyNone,message:strsuccess):returnResponseModel(datadata,messagemessage)# 日志中间件classLogMiddleware(BaseHTTPMiddleware):asyncdefdispatch(self,request:Request,call_next):start_timetime.time()responseawaitcall_next(request)process_timetime.time()-start_timeprint(f⏱️{request.method}{request.url}|{process_time:.3f}s)returnresponse# 创建应用appFastAPI(title第7部分异常处理与中间件)# 添加中间件顺序很重要app.add_middleware(CORSMiddleware,allow_origins[*],allow_credentialsTrue,allow_methods[*],allow_headers[*],)app.add_middleware(LogMiddleware)# 异常处理器app.exception_handler(RequestValidationError)asyncdefvalidation_exception_handler(request:Request,exc:RequestValidationError):returnJSONResponse(status_code400,content{code:400,message:请求参数错误,data:exc.errors()})app.exception_handler(UserNotFoundException)asyncdefuser_not_found_handler(request:Request,exc:UserNotFoundException):returnJSONResponse(status_code404,content{code:404,message:f用户{exc.username}不存在,data:None})# 路由app.get(/health)defhealth_check():returnsuccess_response(data{status:OK})app.get(/users/{username})defget_user(username:str):ifusernamenotin[alice,bob]:raiseUserNotFoundException(username)returnsuccess_response(data{username:username})app.post(/items/)defcreate_item(item:dict):# 故意触发验证错误无 Pydantic 模型nameitem[name]# 如果没有 name 字段会报错returnsuccess_response(data{item:name})六、练习任务动手实践 请先自己尝试完成再查看下方答案任务1添加“文章未找到”异常定义PostNotFoundException注册异常处理器返回 404 和友好消息在/posts/{post_id}路由中使用如果文章不存在任务2限制 CORS 来源修改 CORS 配置只允许http://localhost:3000常见前端开发端口任务3挑战统一错误响应格式所有异常处理器返回{ code: ..., message: ..., data: null }确保 404、400、500 等都遵循此格式七、练习任务参考答案任务1 答案# exceptions.py新增classPostNotFoundException(Exception):def__init__(self,post_id:int):self.post_idpost_id# main.pyfromexceptionsimportPostNotFoundExceptionapp.exception_handler(PostNotFoundException)asyncdefpost_not_found_handler(request:Request,exc:PostNotFoundException):returnJSONResponse(status_code404,content{code:404,message:f文章{exc.post_id}不存在,data:None})# 在 read_post 路由中app.get(/posts/{post_id},response_modelPost)defread_post(post_id:int,session:SessionDepends(get_session)):postsession.get(Post,post_id)ifnotpost:raisePostNotFoundException(post_id)returnpost任务2 答案app.add_middleware(CORSMiddleware,allow_origins[http://localhost:3000],# ← 修改这里allow_credentialsTrue,allow_methods[*],allow_headers[*],)任务3 答案确保所有异常处理器返回统一格式# 示例HTTPException 也统一处理app.exception_handler(HTTPException)asyncdefhttp_exception_handler(request:Request,exc:HTTPException):returnJSONResponse(status_codeexc.status_code,content{code:exc.status_code,message:exc.detail,data:None}) 注意HTTPException是 FastAPI 内部使用的异常捕获它可统一 401、403 等。八、小结在本部分你学会了使用app.exception_handler自定义错误响应通过CORS 中间件解决跨域问题编写自定义中间件实现日志、性能监控设计统一响应格式提升 API 专业性

相关新闻

AI vs Human图像分类模型 [特殊字符][特殊字符]‍[特殊字符] 60K数据训练

AI vs Human图像分类模型 [特殊字符][特殊字符]‍[特殊字符] 60K数据训练

AI vs Human图像分类模型 🤖👨‍🎨 60K数据训练 在当今人工智能飞速发展的时代,AI生成内容的数量呈爆炸式增长,从艺术创作到文本生成,AI已经渗透到各个领域。随之而来的一个重要问题是:我们如何…

2026/7/3 20:46:36 阅读更多 →
美甲美发“效果预览数字模板”,减少沟通误差。

美甲美发“效果预览数字模板”,减少沟通误差。

美甲美发效果预览数字模板系统 - 消除沟通误差的数字化解决方案📖 README文件项目简介本系统专为美甲店和美发沙龙设计,通过数字化模板技术让顾客直观预览服务效果,彻底解决"我说你想要的效果,你做出来的完全不一样"的行…

2026/7/2 23:53:51 阅读更多 →
AI辅助写作:提升技术文档创作效率的秘诀

AI辅助写作:提升技术文档创作效率的秘诀

AI辅助写作:提升技术文档创作效率的秘诀 关键词:AI辅助写作、技术文档、自然语言处理(NLP)、内容生成、效率工具 摘要:技术文档是软件研发、产品交付的“信息桥梁”,但传统写作模式常因耗时、重复、术语不一…

2026/7/3 4:57:00 阅读更多 →

最新新闻

Maven仓库管理:本地、中央和私有仓库的配置与使用

Maven仓库管理:本地、中央和私有仓库的配置与使用

Maven仓库管理:本地、中央和私有仓库的配置与使用 【免费下载链接】maven Apache Maven core 项目地址: https://gitcode.com/GitHub_Trending/ma/maven Apache Maven作为Java项目构建和依赖管理的核心工具,其仓库管理系统是项目成功的关键。本文…

2026/7/4 5:44:37 阅读更多 →
终极MSEdgeRedirect完全指南:如何快速重定向Edge链接到默认浏览器

终极MSEdgeRedirect完全指南:如何快速重定向Edge链接到默认浏览器

终极MSEdgeRedirect完全指南:如何快速重定向Edge链接到默认浏览器 【免费下载链接】MSEdgeRedirect A Tool to Redirect News, Search, Widgets, Weather and More to Your Default Browser 项目地址: https://gitcode.com/GitHub_Trending/ms/MSEdgeRedirect …

2026/7/4 5:42:36 阅读更多 →
CANN / asc-devkit: asc_loadalign_brc_elem BRC搬入API

CANN / asc-devkit: asc_loadalign_brc_elem BRC搬入API

asc_loadalign_brc_elem 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https:/…

2026/7/4 5:42:36 阅读更多 →
Krea-2 Turbo模型三分钟选择指南:bf16、fp8、nvfp4哪个最适合你?

Krea-2 Turbo模型三分钟选择指南:bf16、fp8、nvfp4哪个最适合你?

Krea-2 Turbo模型三分钟选择指南:bf16、fp8、nvfp4哪个最适合你? 【免费下载链接】Krea-2 项目地址: https://ai.gitcode.com/hf_mirrors/Comfy-Org/Krea-2 你是否在使用AI绘图时感到困惑,面对Krea-2 Turbo提供的多种模型格式不知如何…

2026/7/4 5:40:35 阅读更多 →
实战指南:如何用Rust高效构建Lua解释器类型系统与内存管理

实战指南:如何用Rust高效构建Lua解释器类型系统与内存管理

实战指南:如何用Rust高效构建Lua解释器类型系统与内存管理 【免费下载链接】build-lua-in-rust 《用Rust实现Lua解释器》 / _Build a Lua Interpreter in Rust_ 项目地址: https://gitcode.com/gh_mirrors/bu/build-lua-in-rust 想要深入理解编程语言解释器的…

2026/7/4 5:38:35 阅读更多 →
终极硬盘清理指南:用Krokiet轻松找回丢失的存储空间

终极硬盘清理指南:用Krokiet轻松找回丢失的存储空间

终极硬盘清理指南:用Krokiet轻松找回丢失的存储空间 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka 还在为电脑硬盘空间不足而烦恼吗&a…

2026/7/4 5:36:34 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻