当前位置: 首页 > news >正文

fastapi: 多个子应用时判断全局异常的处理形式

一,代码

场景:

fastapi项目下面有两个子应用,一个是api: 接口站,另一个是admin:管理后台,
api接口站,处理异常后返回json,
admin.管理后台,有传统的页面请求也有ajax方式访问,
要求非ajax时,返回到一个错误信息页面,
ajax访问时,当然是返回json

代码:

# 返回异常信息,根据子应用和是否ajax分别进行处理,管理后非ajax请求,跳到错误页面
def response_exception(request: Request,err_data):path = request.url.path# --- 状况 A:如果是 API 子应用的请求,一律返回 JSON ---if path.startswith("/api"):return JSONResponse(status_code=err_data['status_code'],content={"data": {}, "msg": err_data['detail'], "code": err_data['status_code']})# --- 状况 B:如果是 Admin 子应用的请求,需要分情况讨论 ---elif path.startswith("/admin"):accept_header = request.headers.get("accept", "")requested_with = request.headers.get("x-requested-with", "")# 判断是否为 Ajax 请求:# 1. 检查 X-Requested-With 是否为 XMLHttpRequest (传统 Ajax)# 2. 或者检查 Accept 头是否更倾向于接收 JSON (现代 fetch/axios 请求)is_ajax = (requested_with.lower() == "xmlhttprequest" or("application/json" in accept_header and "text/html" not in accept_header))if is_ajax:# 管理后台的 Ajax 请求出错 -> 返回 JSON 方便前端弹窗提示(如 ElementUI/AntDesign)return JSONResponse(status_code=err_data['status_code'],content={"data": {}, "msg": err_data['detail'], "code": err_data['status_code']})else:# 传统的浏览器地址栏直接访问或表单提交出错 -> 渲染精美的错误 HTML 页面# 传入 request 和 错误信息 供模板渲染return templates.TemplateResponse(name="error/error.html",context={"request": request, "status_code": err_data['status_code'], "detail": err_data['detail']},status_code=err_data['status_code'],request=request,)

error.html:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>出错了 - {{ status_code }}</title>
</head>
<body><div style="text-align: center; margin-top: 100px;"><h1>抱歉,系统响应异常 ({{ status_code }})</h1><p style="color: red;">错误原因:{{ detail }}</p><a href="/admin/dashboard">返回管理后台首页</a></div>
</body>
</html>

 

 

二,测试效果 :

页面

image

json

image

http://www.jsqmd.com/news/1249470/

相关文章:

  • PSO-XGBoost组合模型在工业预测中的优化与应用
  • 【Rust自学】11.4. 用should_panic检查恐慌
  • 联邦学习通信效率优化:模型压缩与异步协议实践
  • VS Code 远程部署 claude code 插件
  • 杭州 2026 旧腕表回收避坑,正规门店交易细节拆解 - 每日生活报
  • 基于ddddocr与Hu矩的验证码识别技术实践
  • 2026年联想代理商怎么找:联想授权代理商选择推荐指南 - 全域品牌推荐
  • 收藏!10个企业级AI高频应用场景,小白也能轻松落地实践
  • 嵌入式ADC寄存器深度解析:中断、FIFO与通道选择实战指南
  • 深入解析MibSPI高级功能:灵活片选与并行传输实战指南
  • 武汉刻章的流程是什么看完这篇秒懂 - 跑政通
  • 联系方式:133 9303 2100|2026石家庄市区及周边县城香奈儿包包回收,毓典寄卖行十年老店可上门回收 - 小何收的顶
  • 【Rust自学】11.3. 自定义错误信息
  • 2026肠胃弱猫咪羊奶粉深度横评:5项指标实测+5款主流产品对比,玻璃胃养猫避坑指南
  • ChatGPT、Codex 与 Legacy Code:AI 是老系统的救星,还是压垮它的最后一根稻草?(Plus/Pro 实战观察)
  • DMA裸板驱动使用说明
  • 【Rust自学】6.4. 简单的控制流-if let
  • 小米路由器刷入Breed与OpenWrt详细流程并实现远程管理本地软路由
  • 济南上门回收手表靠谱吗?上门交易风险盘点 - 好物测评局
  • 2026淮南煤矿/电厂职工注意!国开大专采矿/电气自动化专业,助力职称评定! - 我叫小周
  • ARM架构下安装新版docker及docker-compose
  • 2026内蒙古中考落榜别灰心!电大中专保留学籍,曲线救国圆你大学梦! - 我叫小周
  • 宁波实体黄金回收店|大盘价当场结算 - 大牌深度测评
  • 2026高钙猫咪羊奶粉品牌实测横评:5维度实测,附避坑指南+选型方案
  • 大模型推理加速技术:ATB架构与优化实践
  • Nginx 负载均衡和反向代理
  • 深入解析MCU的IOMM:寄存器映射、引脚复用与错误处理实战
  • 2026 欧米茄海马闲置在家贬值?青岛合扬全城实体网点,评估完毕即刻回款! - 好物测评局
  • 每天节省2.7小时!AI自动发邮件的12种高价值场景(销售跟进、客户回访、内部通知全覆盖)
  • 2026年全国混凝土色差修复新标准:3步实现永久无痕