覆盖 fastAPI 的 HTTPException 响应体

Posted

技术标签:

【中文标题】覆盖 fastAPI 的 HTTPException 响应体【英文标题】:Overriding fastAPI's HTTPException response body 【发布时间】:2021-05-22 04:24:28 【问题描述】:

我目前正在为 fastAPI 中的 API 编写一些端点。 我正在定义扩展 fastapi 的 HTTPException 的类。

问题在于 HTTPException 返回一个响应主体,其中包含一个名为 detail 的属性,该属性将是一个字符串或 json 结构,具体取决于您传递给它的对象,如下所示。


  "detail": 
    "msg": "error message here"
  



   "detail": "error message here" 

我想覆盖此行为并让它以我自己的结构响应。

我知道我可以使用异常处理程序装饰器安装自定义异常并让它返回一个 JSONResponse 对象,但这不是我想要的。

【问题讨论】:

你可以简单地返回一个python dict。 FastAPI 会自动将其转换为 json。 @phyominh 是的,我知道这一点,但是我想走这条路的原因是在 api 中实现一种标准,所有错误都将是异常,可以引发和捕获 这个fastapi.tiangolo.com/tutorial/handling-errors可以帮忙吗? 【参考方案1】:

一种选择是set the status code对应你的异常,然后返回一个自定义的响应体。

这是一个使用这种方法解决手头问题的简单玩具示例:

from fastapi import FastAPI, Response, status

myapp = FastAPI()

@myapp.get("/")
async def app_func(response: Response, myparam: str):

    #end point code here

    valid_params = ['a', 'b', 'c']
    
    if myparam not in valid_params:
        #Customize logic, status code, and returned dict as needed

        response.status_code = status.HTTP_400_BAD_REQUEST

        return 'message': 'Oh no! I failed (without detail key)'

    
    response.status_code = status.HTTP_200_OK
    return 'message': 'Yay! I succeeded!'      

可以在here找到可用状态代码的完整列表。

【讨论】:

以上是关于覆盖 fastAPI 的 HTTPException 响应体的主要内容,如果未能解决你的问题,请参考以下文章

FastAPI 1:安装FastAPI

FastAPI 学习之路路径参数和数值的校验

FastAPI 学习之路请求体有多个参数如何处理?

FastAPI 学习之路字符串的校验

fastapi nodejs 性能比较

FastAPI小项目实战:电影列表(Vue3 + FastAPI)