FastAPI 学习之路(四)使用pydantic模型做请求体
FastAPI 学习之路(十三)Cookie 参数,Header参数
前言
我们之前分享的是表单和文件组合使用。我们这次看下处理错误。
正文
某些情况下,需要向客户端返回错误提示。
这里所谓的客户端包括前端浏览器、其他应用程序、物联网设备等。
需要向客户端返回错误提示的场景主要如下:
遇到这些情况时,通常要返回 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 响应结果。
不过,也可以使用自定义处理器覆盖默认异常处理器。
后记
发现问题,解决问题。遇到问题,慢慢解决问题即可。
欢迎关注雷子说测试开发,后续将会持续为大家分享更多的技术知识
如果你有问题可以留言或者加我微信:952943386。2021,一起牛转钱坤,一起牛逼。
如果觉得这篇文章还不错,来个【分享、点赞、在看】三连吧,让更多的人也看到~