系列文章:

  FastAPI 学习之路(一)fastapi--高性能web开发框架

  FastAPI 学习之路(二)

  FastAPI 学习之路(三)

  FastAPI 学习之路(四)

  FastAPI 学习之路(五)

FastAPI 学习之路(六)查询参数,字符串的校验

  FastAPI 学习之路(七)字符串的校验

   FastAPI 学习之路(八)路径参数和数值的校验

  FastAPI 学习之路(九)请求体有多个参数如何处理?

  FastAPI 学习之路(十)请求体的字段

FastAPI 学习之路(十一)请求体 - 嵌套模型

    FastAPI 学习之路(十二)接口几个额外信息和额外数据类型

FastAPI 学习之路(十三)Cookie 参数,Header参数

    FastAPI 学习之路(十四)响应模型

  FastAPI 学习之路(十五)响应状态码

    FastAPI 学习之路(十六)Form表单

FastAPI 学习之路(十七)上传文件

FastAPI 学习之路(十八)表单与文件

某些情况下,需要向客户端返回错误提示。

这里所谓的客户端包括前端浏览器、其他应用程序、物联网设备等。

需要向客户端返回错误提示的场景主要如下:

  • 客户端没有执行操作的权限

  • 客户端没有访问资源的权限

  • 客户端要访问的项目不存在

  • 等等 ...

遇到这些情况时,通常要返回 4XX(400 至 499)HTTP 状态码

4XX 状态码与表示请求成功的 2XX(200 至 299) HTTP 状态码类似。

只不过,4XX 状态码表示客户端发生的错误。

如何处理呢,我们通过一段代码来演示

from fastapi import FastAPI, HTTPException
app = FastAPI()
items = {"test": "雷子说测试开发"}
@app.get("/items/{item_id}")
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]}

我们看下接口的返回

这是正常的接口返回,我们来看下我们错误的异常返回

我们可以看到这个时候可以正常返回,但是我们的状态码已经被我们改成404了。

HTTPException 是额外包含了和 API 有关数据的常规 Python 异常。

因为是 Python 异常,所以不能 return,只能 raise。

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

响应结果

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

{    "item": "雷子说测试开发"}
 

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

{

"detail": "Item not found"

}

触发 HTTPException 时,可以用参数 detail 传递任何能转换为 JSON 的值,不仅限于 str。

还支持传递 dict、list 等数据结构。

FastAPI 能自动处理这些数据,并将之转换为 JSON。

添加自定义响应头

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

我们看下如何自定义响应头

from fastapi import FastAPI, HTTPException

app = FastAPI()

items = {"test": "雷子说测试开发"}

@app.get("/items/{item_id}")
def read_item(item_id: str):
if item_id not in items:
raise HTTPException(status_code=404, detail="Item not found",
headers={"X-Error": "NADOR"},
)
return {"item": items[item_id]}

结果如下:

我们还可以去自定义我们的异常处理器。我们看下如何来实现的。

from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
class UnicornException(Exception):
def __init__(self, name: str):
self.name = name
app = FastAPI() @app.exception_handler(UnicornException)
async def unicorn_exception_handler(request: Request, exc: UnicornException): return JSONResponse(
status_code=408,
content={"message": f"Oops! {exc.name} "},
) @app.get("/one/{name}")
async def one(name: str):
if name == "leizi": raise UnicornException(name=name) return {"name": name}
我们可以看到,我们的实现其实很简单。用 @app.exception_handler() 即可添加自定义异常控制器。

我们请求下,当我们的名称等于雷子的时候,就是返回我们自定义的异常。

 

正常的请求

那么就可以看到,我们去实现的自定义的异常是成功的。

FastAPI 自带了一些默认异常处理器。

触发 HTTPException 或请求无效数据时,这些处理器返回默认的 JSON 响应结果。

不过,也可以使用自定义处理器覆盖默认异常处理器。

文章首发在公众号,欢迎关注。

FastAPI 学习之路(十九)处理错误的更多相关文章

  1. FastAPI 学习之路(九)请求体有多个参数如何处理?

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  2. IOS学习之路十九(JSON与Arrays 或者 Dictionaries相互转换)

    今天写了个json与Arrays 或者 Dictionaries相互转换的例子很简单: 通过 NSJSONSerialization 这个类的 dataWithJSONObject: options: ...

  3. 嵌入式Linux驱动学习之路(十九)触摸屏驱动、tslib测试

    触摸屏使用流程: 1. 按下产生中断. 2.在中断处理程序中启动AD转换XY坐标. 3.AD转换结束并产生AD中断. 4. 在AD的中断处理函数中上报信息,启动定时器. 5. 定时器时间到后进入中断, ...

  4. FastAPI 学习之路(二十)接口文档配置相关

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  5. FastAPI 学习之路(十五)响应状态码

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  6. FastAPI 学习之路(十六)Form表单

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  7. FastAPI 学习之路(十二)接口几个额外信息和额外数据类型

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  8. FastAPI 学习之路(十四)响应模型

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  9. FastAPI 学习之路(十八)表单与文件

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

随机推荐

  1. CPU内部结构域寄存器

    CPU内部结构域寄存器   64位和32位系统区别: 寄存器是CPU内部最基本的存储单元. CPU对外是通过总线(地址.控制.数据)来和外部设备交互的,总线的宽度是8位,同时CPU的寄存器也是8位,那 ...

  2. 超详细kafka教程来啦

    Kafka的概念和入门 Kafka是一个消息系统.由LinkedIn于2011年设计开发. Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度O(1)的方式提供消息持 ...

  3. 【死磕NIO】— NIO基础详解

    Netty 是基于Java NIO 封装的网络通讯框架,只有充分理解了 Java NIO 才能理解好Netty的底层设计.Java NIO 由三个核心组件组件: Buffer Channel Sele ...

  4. IPSec协议框架

    文章目录 1. IPSec简介 1.1 起源 1.2 定义 1.3 受益 2. IPSec原理描述 2.1 IPSec协议框架 2.1.1 安全联盟 2.1.2 安全协议 报文头结构 2.1.3 封装 ...

  5. C# Dapper基本三层架构使用 (四、WinForm UI层)

    UI层主要功能是显示数据和接受传输用户的数据,可以在为网站的系统运行提供交互式操作界面,表示层的应用方式比较常见,例如Windows窗体和Web页面. 在项目中增加WinForm应用程序,结构如下 添 ...

  6. 完全分布式Hadoop2.X的搭建

    准备工作: 安装jdk 克隆2台虚拟机完成后:新的2台虚拟机,请务必依次修改3台虚拟机的ip地址和主机名称[建议三台主机名称依次叫做:master.node1.node2 ](虚拟机的克隆,前面的博客 ...

  7. 告别Kafka Stream,让轻量级流处理更加简单

    一说到数据孤岛,所有技术人都不陌生.在 IT 发展过程中,企业不可避免地搭建了各种业务系统,这些系统独立运行且所产生的数据彼此独立封闭,使得企业难以实现数据共享和融合,并形成了"数据孤岛&q ...

  8. 搭建http文件服务器 - Windows使用IIS搭建http文件服务器

  9. pycharm 增删改查 mysql数据库

    1.pycharm创建mysql数据表######################################################import pymysql# 创建连接con = p ...

  10. jenkin—持续集成

    jenkins与持续集成 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能.(百度百科) 持续集 ...