FastAPI에서 RequestValidationError를 발생시키면 사용자 정의 오류 응답을 보낼 수 있습니다. 이는 필수 헤더와 같이 특정 조건을 충족해야 하는 엔드포인트에 유용합니다.
이 옵션을 사용하면 기본 예외 처리기를 재정의할 수 있습니다. RequestValidationError를 사용하면 오류 응답을 사용자 정의할 수 있습니다.
from fastapi import FastAPI, Request, Header, status from fastapi.exceptions import RequestValidationError from fastapi.responses import JSONResponse app = FastAPI() routes_with_custom_exception = ['/'] @app.exception_handler(RequestValidationError) async def validation_exception_handler(request: Request, exc: RequestValidationError): if request.url.path in routes_with_custom_exception: return JSONResponse(content={'401': 'Unauthorized'}, status_code=401) return JSONResponse( status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, content=jsonable_encoder({'detail': exc.errors(), 'body': exc.body}), )
하위 애플리케이션을 생성하면 자체 예외 핸들러를 사용하여 별도의 API 인스턴스를 생성할 수 있습니다. 이를 통해 특히 하위 애플리케이션에 대한 오류 처리를 사용자 정의할 수 있습니다.
from fastapi import FastAPI from fastapi.exceptions import RequestValidationError from fastapi.responses import JSONResponse app = FastAPI() subapi = FastAPI() @subapi.exception_handler(RequestValidationError) async def validation_exception_handler(exc: RequestValidationError): return JSONResponse(content={'401': 'Unauthorized'}, status_code=401) @subapi.get('/') async def subapi_route(some_custom_header: str = Header(...)): return {'some-custom-header': some_custom_header} app.mount('/sub', subapi)
이 메서드를 사용하면 사용자 정의 APIRoute 클래스를 사용하여 특정 경로의 동작을 변경할 수 있습니다.
from fastapi import FastAPI, APIRouter, Response, Request, Header, HTTPException from fastapi.exceptions import RequestValidationError class ValidationErrorHandlingRoute(APIRoute): def get_route_handler(self) -> Callable: original_route_handler = super().get_route_handler() async def custom_route_handler(request: Request) -> Response: try: return await original_route_handler(request) except RequestValidationError as e: raise HTTPException(status_code=401, detail='401 Unauthorized') return custom_route_handler app = FastAPI() router = APIRouter(route_class=ValidationErrorHandlingRoute) @router.get('/custom') async def custom_route(some_custom_header: str = Header(...)): return {'some-custom-header': some_custom_header} app.include_router(router)
옵션 1은 특정 경로에 대한 오류 응답을 맞춤설정해야 하는 경우에만 구현하기 쉽습니다. 옵션 2는 다양한 보안 정책 적용이나 예외 처리 등 API의 하위 영역을 더 효과적으로 제어하려는 경우에 적합합니다. 옵션 3을 사용하면 개별 경로를 더 효과적으로 제어할 수 있으며 경로 내의 특정 사례를 처리하는 데 유용합니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3