如果你遇到pydantic验证和自己想要的response不一致,不妨来看看这段代码,优雅的将pydantic的类型提示错误修改为自己response的msg

import uvicorn
from fastapi import FastAPI, HTTPException
from fastapi.exceptions import RequestValidationError
from fastapi.responses import PlainTextResponse
from starlette.exceptions import HTTPException as StarletteHTTPException
from fastapi.responses import JSONResponse
import json

app = FastAPI()


# @app.exception_handler(StarletteHTTPException)
# async def http_exception_handler(request, exc):
#     return PlainTextResponse(str(exc.detail), status_code=exc.status_code)

resp_dict = {}
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request, exc):
    exce = json.loads(str(exc.json()))
    return JSONResponse({
        "code": 1,
        'msg': {
            "explain":"参数错误",
            "detail":exce,
        },
        "data": []
    })

from pydantic import BaseModel
class ItemSchema(BaseModel):
    item_id:int
    item_name:int
@app.get("/items/{item_id}")
async def read_item(item_id: int):
    if item_id == 3:
        raise HTTPException(status_code=418, detail="Nope! I don't like 3.")
    return resp_dict

@app.post("/items")
async def read_item(itemscheme:ItemSchema):
    itemscheme = itemscheme.dict()
    resp_dict.update(**itemscheme)
    return resp_dict

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)
http://127.0.0.1:8000/items post
application/json
{
    "item_id":"a",
    "item_name":"a"
}
response:
>>>
{
    "code": 1,
    "msg": {
        "explain": "参数错误",
        "detail": [
            {
                "loc": [
                    "body",
                    "item_id"
                ],
                "msg": "value is not a valid integer",
                "type": "type_error.integer"
            },
            {
                "loc": [
                    "body",
                    "item_name"
                ],
                "msg": "value is not a valid integer",
                "type": "type_error.integer"
            }
        ]
    },
    "data": []
}