ホームページ >バックエンド開発 >Python チュートリアル >FastAPI で特定のルートのエラー応答をカスタマイズするにはどうすればよいですか?
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 (カスタム例外) Handler)
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-Except 内で例外を処理できます。ブロック:
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 中国語 Web サイトの他の関連記事を参照してください。