覆盖 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 响应体的主要内容,如果未能解决你的问题,请参考以下文章