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

FastAPI学习-22.response 异常处理 HTTPException

前言

某些情况下,需要向客户端返回错误提示。
这里所谓的客户端包括前端浏览器、其他应用程序、物联网设备等。
需要向客户端返回错误提示的场景主要如下:

  • 客户端没有执行操作的权限
  • 客户端没有访问资源的权限
  • 客户端要访问的项目不存在
  • 等等 …

遇到这些情况时,通常要返回 4XX(400 至 499)HTTP 状态码
4XX 状态码与表示请求成功的 2XX(200 至 299) HTTP 状态码类似。
只不过,4XX 状态码表示客户端发生的错误。

使用 HTTPException

向客户端返回 HTTP 错误响应,可以使用 HTTPException

from fastapi import FastAPI, HTTPExceptionapp = FastAPI()items = {"foo": "The Foo Wrestlers"}@app.get("/items/{item_id}")
async def read_item(item_id: str):if item_id not in items:raise HTTPException(status_code=404, detail="Item not found")return {"item": items[item_id]}

触发 HTTPException

HTTPException 是额外包含了和 API 有关数据的常规 Python 异常。
因为是 Python 异常,所以不能 return,只能 raise

如在调用_路径操作函数_里的工具函数时,触发了 HTTPException,FastAPI 就不再继续执行_路径操作函数_中的后续代码,而是立即终止请求,并把 HTTPException 的 HTTP 错误发送至客户端。

在介绍依赖项与安全的章节中,您可以了解更多用 raise 异常代替 return 值的优势。

本例中,客户端用 ID 请求的 item 不存在时,触发状态码为 404 的异常:

    raise HTTPException(status_code=404, detail="Item not found")

响应结果

请求为 http://example.com/items/fooitem_id 为 「foo」)时,客户端会接收到 HTTP 状态码 - 200 及如下 JSON 响应结果:

{"item": "The Foo Wrestlers"
}

但如果客户端请求 http://example.com/items/baritem_id 「bar」 不存在时),则会接收到 HTTP 状态码 - 404(「未找到」错误)及如下 JSON 响应结果:

{"detail": "Item not found"
}

触发 HTTPException 时,可以用参数 detail 传递任何能转换为 JSON 的值,不仅限于 str
还支持传递 dictlist 等数据结构。
FastAPI 能自动处理这些数据,并将之转换为 JSON。

添加自定义响应头

有些场景下要为 HTTP 错误添加自定义响应头。例如,出于某些方面的安全需要。

一般情况下可能不会需要在代码中直接使用响应头。

但对于某些高级应用场景,还是需要添加自定义响应头:

from fastapi import FastAPI, HTTPExceptionapp = FastAPI()items = {"foo": "The Foo Wrestlers"}@app.get("/items-header/{item_id}")
async def read_item_header(item_id: str):if item_id not in items:raise HTTPException(status_code=404,detail="Item not found",headers={"X-Error": "There goes my error"},)return {"item": items[item_id]}

响应结果

HTTP/1.1 404 Not Found
date: Sun, 24 Sep 2023 01:31:18 GMT
server: uvicorn
x-error: There goes my error
content-length: 27
content-type: application/json{"detail":"Item not found"}
http://www.lryc.cn/news/187006.html

相关文章:

  • 75.颜色分类
  • 浅谈分散式存储项目MEMO
  • ansible角色运行指定角色路径
  • 【数据结构-字符串 三】【字符串转换】字符串解码
  • LabVIEW中不同颜色连线的含义
  • 如何才能在Ubuntu系统部署RabbitMQ服务器并公网访问
  • PCL点云处理之使用变换矩阵对点云去中心化(二百零七)
  • ubuntu编译安装并测试opencv
  • Vue3最佳实践 第七章 TypeScript 上
  • 【maven私库nexus开机自启动】
  • ctfshow-web5(md5弱比较)
  • 【GIT版本控制】--子模块
  • 享元模式 基于享元模式的对象池设计与开发应用(设计模式与开发实践 P12)
  • postman测试文件上传接口教程
  • 【bug日记】spring项目使用配置类和测试类操作数据库
  • Django之主键外键详解
  • HDLbits: ece241 2014 q7b
  • C++多态的理解
  • 关于深拷贝和浅拷贝你需要了解的内容
  • Visual Studio自定义模板参数、备注
  • 机器学习-数值特征
  • Rocky(centos)安装nginx并设置开机自启
  • Android约束布局ConstraintLayout的Guideline,CardView
  • LVGL8.3.6 Flex(弹性布局)
  • 计算机算法分析与设计(8)---图像压缩动态规划算法(含C++)代码
  • React 状态管理 - Mobx 入门(上)
  • OLED透明屏技术在智能手机、汽车和广告领域的市场前景
  • 考研是为了逃避找工作的压力吗?
  • 广州华锐互动:VR动物解剖实验室带来哪些便利?
  • Uniapp 婚庆服务全套模板前端