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