"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 특정 FastAPI 경로에 대한 오류 응답을 사용자 정의하는 방법은 무엇입니까?

특정 FastAPI 경로에 대한 오류 응답을 사용자 정의하는 방법은 무엇입니까?

2024년 12월 21일에 게시됨
검색:732

How to Customize Error Responses for Specific FastAPI Routes?

FastAPI의 특정 경로에 대한 오류 응답을 사용자 정의하는 방법

FastAPI에서 RequestValidationError를 발생시키면 사용자 정의 오류 응답을 보낼 수 있습니다. 이는 필수 헤더와 같이 특정 조건을 충족해야 하는 엔드포인트에 유용합니다.

옵션 1: 기본 예외 처리기 재정의

이 옵션을 사용하면 기본 예외 처리기를 재정의할 수 있습니다. 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}),
    )

옵션 2: 하위 애플리케이션 사용

하위 애플리케이션을 생성하면 자체 예외 핸들러를 사용하여 별도의 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)

옵션 3: 사용자 정의 APIRoute 클래스 사용

이 메서드를 사용하면 사용자 정의 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