FastAPI 学习之路(十九)处理错误

简介: FastAPI 学习之路(十九)处理错误

系列文章:

  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]}


我们看下接口的返回


image.png


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


image.png


我们可以看到这个时候可以正常返回,但是我们的状态码已经被我们改成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]}


结果如下:


image.png


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


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() 即可添加自定义异常控制


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


image.png


正常的请求


image.png


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


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


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


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



相关文章
|
JSON C++ 数据格式
FastAPI(27)- Handling Errors 处理错误 (下)
FastAPI(27)- Handling Errors 处理错误 (下)
493 0
FastAPI(27)- Handling Errors 处理错误 (下)
|
JSON API 数据格式
FastAPI(27)- Handling Errors 处理错误 (上)
FastAPI(27)- Handling Errors 处理错误 (上)
224 0
FastAPI(27)- Handling Errors 处理错误 (上)
|
NoSQL 测试技术 Redis
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(下)
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(下)
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(下)
|
测试技术 数据安全/隐私保护
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(上)
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(上)
|
存储 测试技术 数据安全/隐私保护
FastAPI(八十三)实战开发《在线课程学习系统》--注册接口单元测试
FastAPI(八十三)实战开发《在线课程学习系统》--注册接口单元测试
FastAPI(八十三)实战开发《在线课程学习系统》--注册接口单元测试
FastAPI(八十二)实战开发《在线课程学习系统》接口开发-- 课程上架下架
FastAPI(八十二)实战开发《在线课程学习系统》接口开发-- 课程上架下架
|
NoSQL Redis 数据库
FastAPI(八十一)实战开发《在线课程学习系统》接口开发-- 推荐课程列表与课程点赞
FastAPI(八十一)实战开发《在线课程学习系统》接口开发-- 推荐课程列表与课程点赞
FastAPI(八十)实战开发《在线课程学习系统》接口开发-- 课程列表
FastAPI(八十)实战开发《在线课程学习系统》接口开发-- 课程列表
FastAPI(七十九)实战开发《在线课程学习系统》接口开发-- 加入课程和退出课程
FastAPI(七十九)实战开发《在线课程学习系统》接口开发-- 加入课程和退出课程
FastAPI(七十八)实战开发《在线课程学习系统》接口开发-- 评论
FastAPI(七十八)实战开发《在线课程学习系统》接口开发-- 评论