• 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]}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    触发 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")
    
    • 1

    响应结果

    请求为 http://example.com/items/fooitem_id 为 「foo」)时,客户端会接收到 HTTP 状态码 - 200 及如下 JSON 响应结果:

    {
      "item": "The Foo Wrestlers"
    }
    
    • 1
    • 2
    • 3

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

    {
      "detail": "Item not found"
    }
    
    • 1
    • 2
    • 3

    触发 HTTPException 时,可以用参数 detail 传递任何能转换为 JSON 的值,不仅限于 str
    还支持传递 dictlist 等数据结构。
    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]}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    响应结果

    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"}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    2022最新软件测试面试八股文,全网最全最新,堪称地表最强
    Html常用标签
    测试用例设计方法之判定表法
    高等数学(第七版)同济大学 习题3-2 个人解答
    M4 tm4c1294单片机软件调式总结
    docker问题解决记录
    印度证明离开中国制造,富士康将再没奇迹
    Java实现抽奖幸运儿
    Vue3 源码阅读(7):响应式系统 —— 响应式 API 精讲
    【机械臂、无人机规控篇】(9)机械臂轨迹规划、跟踪控制方向
  • 原文地址:https://blog.csdn.net/qq_27371025/article/details/133652945