FastAPI学习-22.response 异常处理 HTTPException
前言
某些情况下,需要向客户端返回错误提示。
这里所谓的客户端包括前端浏览器、其他应用程序、物联网设备等。
需要向客户端返回错误提示的场景主要如下:
- 客户端没有执行操作的权限
- 客户端没有访问资源的权限
- 客户端要访问的项目不存在
- 等等 ...
遇到这些情况时,通常要返回 4XX(400 至 499)HTTP 状态码。
4XX 状态码与表示请求成功的 2XX(200 至 299) HTTP 状态码类似。
只不过,4XX 状态码表示客户端发生的错误。
使用 HTTPException
向客户端返回 HTTP 错误响应,可以使用 HTTPException
。
from fastapi import FastAPI, HTTPException
app = 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/foo
(item_id
为 「foo」
)时,客户端会接收到 HTTP 状态码 - 200 及如下 JSON 响应结果:
{
"item": "The Foo Wrestlers"
}
但如果客户端请求 http://example.com/items/bar
(item_id
「bar」
不存在时),则会接收到 HTTP 状态码 - 404(「未找到」错误)及如下 JSON 响应结果:
{
"detail": "Item not found"
}
触发
HTTPException
时,可以用参数detail
传递任何能转换为 JSON 的值,不仅限于str
。
还支持传递dict
、list
等数据结构。
FastAPI 能自动处理这些数据,并将之转换为 JSON。
添加自定义响应头
有些场景下要为 HTTP 错误添加自定义响应头。例如,出于某些方面的安全需要。
一般情况下可能不会需要在代码中直接使用响应头。
但对于某些高级应用场景,还是需要添加自定义响应头:
from fastapi import FastAPI, HTTPException
app = 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"}