• 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
  • 相关阅读:
    Linux网络编程(socket本机通信)
    CentOS8迁移tencentOS实践
    springcloud24:分布式事务 Seata处理分布式事务总结篇
    所有子集 剑指 Offer II 079
    面试官:你知道websocket的心跳机制吗?
    自动化办公02 用openpyxl库操作excel.xlsx文件(新版本)
    支持向量机:原理与python案例
    Ubuntu 22.04 x86_64 源码编译 pytorch-v2.0.1 笔记【2】编译成功
    简单聊聊k8s,和docker之间的关系
    频率出现七次的词汇
  • 原文地址:https://blog.csdn.net/qq_27371025/article/details/133652945