系列文章:
FastAPI 学习之路(一)fastapi--高性能web开发框架
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 响应结果。
不过,也可以使用自定义处理器覆盖默认异常处理器。