FastAPI では、リクエストを検証するときに、パラメータが欠落しているか無効である場合、 FastAPI は RequestValidationError 例外を発生させます。デフォルトでは、この例外は 422 Unprocessable Entity 応答を返します。ただし、特定のルートに合わせてこの応答をカスタマイズすることもできます。これを実現するためのいくつかのアプローチを次に示します。
RequestValidationError のデフォルトの例外ハンドラーをオーバーライドし、目的の例外ハンドラーを提供します。
from fastapi import FastAPI, Request, status, HTTPException from fastapi.responses import JSONResponse from fastapi.encoders import jsonable_encoder from fastapi.exceptions import RequestValidationError 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)
サブアプリケーションを作成し、それをメイン アプリにマウントします。特定のルート。サブアプリケーションで RequestValidationError の例外ハンドラーをオーバーライドします。
from fastapi import FastAPI, RequestValidationError, HTTPException from fastapi.responses import JSONResponse app = FastAPI() subapi = FastAPI() @subapi.exception_handler(RequestValidationError) async def validation_exception_handler(request: Request, exc: RequestValidationError): return JSONResponse(content={'401': 'Unauthorized'}, status_code=401) app.mount('/sub', subapi)
カスタム APIRoute サブクラスを作成してオーバーライドしますget_route_handler メソッド。これにより、リクエストをインターセプトし、RequestValidationError 例外を処理できるようになります。
from fastapi import FastAPI from fastapi.routing import APIRoute from fastapi.responses import JSONResponse from fastapi.exceptions import RequestValidationError from fastapi.requests import Request class ValidationErrorHandlingRoute(APIRoute): def get_route_handler(self): original_route_handler = super().get_route_handler() async def custom_route_handler(request: Request): try: return await original_route_handler(request) except RequestValidationError as e: return JSONResponse(content={'401': 'Unauthorized'}, status_code=401) 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 サイトの他の関連記事を参照してください。