FastAPI에서 특정 경로에 대한 오류 응답을 사용자 정의하는 방법
FastAPI에서는 다음을 재정의하여 특정 경로에 대한 오류 응답을 사용자 정의할 수 있습니다. RequestValidationError에 대한 예외 처리기입니다. 다음은 몇 가지 옵션입니다.
옵션 1(단순)
OpenAPI 문서에서 헤더가 선택 사항으로 표시되는 것이 괜찮다면 다음을 사용할 수 있습니다. 다음 코드:
from fastapi import Header, HTTPException @app.post("/") def some_route(some_custom_header: Optional[str] = Header(None)): if not some_custom_header: raise HTTPException(status_code=401, detail="Unauthorized") return {"some-custom-header": some_custom_header}
옵션 2(사용자 정의 예외 처리기)
OpenAPI 문서에 필요한 대로 헤더가 표시되도록 하려면 예외 처리기를 재정의할 수 있습니다.
from fastapi import FastAPI, Request, Header, status from fastapi.exceptions import RequestValidationError from fastapi.responses import JSONResponse from fastapi.encoders import jsonable_encoder 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: # Check for the specific Header in the errors for err in exc.errors(): if err['loc'][0] == 'header' and err['loc'][1] == 'some-custom-header': 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}), ) @app.get("/") def some_route(some_custom_header: str = Header(...)): return {'some-custom-header': some_custom_header}
옵션 3(하위 애플리케이션)
하위 애플리케이션을 만들어 메인 앱에 탑재할 수 있습니다. 이렇게 하면 하위 애플리케이션에 정의된 경로에 대해서만 예외 처리기를 사용자 정의할 수 있습니다.
from fastapi import FastAPI, Request, Header from fastapi.exceptions import RequestValidationError from fastapi.responses import JSONResponse app = FastAPI() @app.get('/') async def main(): return {'message': 'Hello from main API'} subapi = FastAPI() @subapi.exception_handler(RequestValidationError) async def validation_exception_handler(request: Request, exc: RequestValidationError): # Custom exception handling return JSONResponse(content={'401': 'Unauthorized'}, status_code=401) @subapi.get('/') async def sub_api_route(some_custom_header: str = Header(...)): return {'some-custom-header': some_custom_header} app.mount('/sub', subapi)
옵션 4(사용자 정의 APIRouter 및 예외 처리)
사용자 정의 APIRouter 클래스를 사용하고 try-Exception 블록 내에서 예외를 처리할 수 있습니다.
from fastapi import FastAPI, APIRouter, Response, Request, Header, HTTPException from fastapi.responses import JSONResponse from fastapi.exceptions import RequestValidationError from fastapi.routing import APIRoute from typing import Callable 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: # Custom exception handling raise HTTPException(status_code=401, detail='401 Unauthorized') return custom_route_handler app = FastAPI() router = APIRouter(route_class=ValidationErrorHandlingRoute) @app.get('/') async def main(): return {'message': 'Hello from main API'} @router.get('/custom') async def custom_route(some_custom_header: str = Header(...)): return {'some-custom-header': some_custom_header} app.include_router(router)
요구 사항에 가장 적합한 옵션을 선택하세요.
위 내용은 FastAPI의 특정 경로에 대한 오류 응답을 사용자 정의하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!