• FastAPI 学习之路(十九)处理错误/异常


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

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

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

    • 客户端没有执行操作的权限
    • 客户端没有访问资源的权限
    • 客户端要访问的项目不存在
    • 等等 ...

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

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

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

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

    1. from fastapi import FastAPI, HTTPException
    2. app = FastAPI()
    3. items = {"test": "这是测试"}
    4. @app.get("/items/{item_id}")
    5. def read_item(item_id: str):
    6. if item_id not in items:
    7. raise HTTPException(status_code=404, detail="Item not found")
    8. return {"item": items[item_id]}

    我们看下返回结果

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

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

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

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

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

    响应结果

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

    {

    "item": "这是测试"

    }

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

    {

    "detail": "Item not found"

    }

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

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

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

    添加自定义响应头

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

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

    1. from fastapi import FastAPI, HTTPException
    2. app = FastAPI()
    3. items = {"test": "这是测试"}
    4. @app.get("/items/{item_id}")
    5. def read_item(item_id: str):
    6. if item_id not in items:
    7. raise HTTPException(status_code=404, detail="Item not found", headers={
    8. "X-Error": "Error le"
    9. })
    10. return {"item": items[item_id]}

    结果如下:

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

    1. from fastapi import FastAPI, Request
    2. from fastapi.responses import JSONResponse
    3. app = FastAPI()
    4. class UnicornException(Exception):
    5. def __init__(self, name: str):
    6. self.name = name
    7. @app.exception_handler(UnicornException)
    8. async def unicorn_exception_handler(request: Request, exc: UnicornException):
    9. return JSONResponse(
    10. status_code=400,
    11. content={"message": f"Oops! {exc.name} "}
    12. )
    13. @app.get("/one/{name}")
    14. def one(name: str):
    15. if name == "lc":
    16. raise UnicornException(name=name)
    17. return {"name": name}

    我们可以看到,我们的实现其实很简单。用 @app.exception_handler() 即可添加自定义异常控制

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

    正常的请求

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

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

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

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

  • 相关阅读:
    搭建truenas开源存储
    Moonbirds 是什么,为何公售后能迅速出圈 ?
    K8s复习笔记10--1个POD2个container实现Wordpress K8s部署
    MySQL主从复制
    windows安装paddlepaddle遇到的问题及解决方案
    Macbook使用GitLab的简单终端命令操作记录
    flink1.13报错:The file STDOUT does not exist on the TaskExecutor
    2023.10 秋爽版 java 软件授权激活 架构 java代码混淆 按日期授权 不联网
    微信小程序 table表格 固定表头和首列 右侧表格可以左右滚动
    SpringBoot自动装配原理
  • 原文地址:https://blog.csdn.net/myli_binbin/article/details/126545347