FastAPI:如何为特定路由自定义422异常?

Oct*_*per 5 python http-status-code-422 pydantic fastapi

如何仅针对 FastAPI 中的一条路由将 422 标准异常替换为自定义异常?

我不想替换应用项目,只想替换一条路线。我读了很多文档,但我不明白如何做到这一点。

我需要更改异常的路线示例422

from fastapi import APIRouter
from pydantic import BaseModel

router = APIRouter()


class PayloadSchema(BaseModel):
    value_int: int
    value_str: str


@router.post('/custom')
async def custom_route(payload: PayloadSchema):
    return payload
Run Code Online (Sandbox Code Playgroud)

bra*_*ipt 2

您可以向路由器注册多个错误处理程序。您可以重新声明默认处理程序,然后根据路径选择调用它:

class PayloadSchema(BaseModel):
    value_int: int
    value_str: str

router = APIRouter()

@router.post('/standard')
async def standard_route(payload: PayloadSchema):
    return payload

@app.exception_handler(RequestValidationError)
async def standard_validation_exception_handler(request: Request, exc: RequestValidationError):
    return JSONResponse(
        status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
        content=jsonable_encoder({"detail": exc.errors(), "body": exc.body}),
    )

@router.post('/custom')
async def custom_route(payload: PayloadSchema):
    return payload

@app.exception_handler(RequestValidationError)
async def custom_exception_handler(request: Request, exc: RequestValidationError):
    if (request.url.path == '/custom'):
        return JSONResponse({"error": "Bad request, must be a valid PayloadSchema format"}, status_code=400)
    else:
        return await standard_validation_exception_handler(request, exc)

app = FastAPI()
app.include_router(router)
app.add_exception_handler(RequestValidationError, custom_exception_handler)
Run Code Online (Sandbox Code Playgroud)

或者您可以直接使用@app.exception_handler装饰器而不需要路由器(请参阅 FastAPI 文档)。