1.验证错误
1.1 默认返回
当传参不符合模型验证规则时,默认错误信息和格式返回如下:
{
"detail": [
{
"loc": [
"body",
"age"
],
"msg": "ensure this value is greater than 18",
"type": "value_error.number.not_gt",
"ctx": {
"limit_value": 18
}
},
{
"loc": [
"body",
"likes"
],
"msg": "ensure this value has at least 2 items",
"type": "value_error.list.min_items",
"ctx": {
"limit_value": 2
}
}
]
}
在上篇文章 Python框架篇(3):FastApi-响应模型中,我们强调的是接口对外输出结构应该一致,所以即便参数错误应该输出以下结构:
{
"code":-1,
"msg":"具体错误信息...",
"data": null,
"additional":{
"time":"2023-12-04 19:00:23",
"trace_id":"cc1b12a5dfee26a7dcc29fe47dcfbde0"
}
}
按照官方文档说法,我们需要自定义错误处理器,并以此来覆盖框架默认的异常处理器,参数验证错误处理器默认走的是RequestValidationError
,所以覆盖它就行,下面是实现步骤
1.2 自定义处理器
新建包app/errors
,并新增文件validation_error.py
,文件内容如下:
from fastapi import Request, status
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
from app.types import response
from fastapi.encoders import jsonable_encoder
async def validationExceptionHandler(request: Request, exc: RequestValidationError):
""" 自定义参数验证异常错误"""
errMsg = ""
for error in exc.errors():
errMsg += ".".join(error.get("loc")) + ":" + error.get("msg") + ";"
# 这里response.ResponseFail是上篇文章中的内容
return JSONResponse(status_code=status.HTTP_200_OK, content=jsonable_encoder(response.ResponseFail(errMsg)))
在包app/errors/__init__.py
引用,并封装统一注册方法:
from fastapi import FastAPI
from .validation_error import validationExceptionHandler
from fastapi.exceptions import RequestValidationError
def registerCustomErrorHandle(server: FastAPI):
""" 统一注册自定义错误处理器"""
# 注册参数验证错误,并覆盖模式RequestValidationError
server.add_exception_handler(RequestValidationError, validationExceptionHandler)
1.3 注册&覆盖
在main.py
中调用registerCustomErrorHandle
# 引入
from app import erro