
FastAPI で特定のルートのエラー応答をカスタマイズする方法
FastAPI では、RequestValidationError を発生させることでカスタム エラー応答を送信できます。これは、必須ヘッダーなど、特定の条件を満たす必要があるエンドポイントに役立ちます。
オプション 1: デフォルトの例外ハンドラーをオーバーライドする
このオプションを使用すると、デフォルトの例外ハンドラーをオーバーライドできます。 RequestValidationError を使用すると、エラー応答をカスタマイズできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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: を使用します。 sub-application
サブアプリケーションを作成すると、独自の例外ハンドラーを持つ個別の API インスタンスを作成できます。これにより、サブアプリケーション専用のエラー処理をカスタマイズできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 クラスを使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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)
|
ログイン後にコピー
どのオプションを使用する必要がありますかuse?
オプション 1 は、特定のルートのエラー応答をカスタマイズする必要がある場合にのみ実装するのが簡単です。オプション 2 は、さまざまなセキュリティ ポリシーや例外処理を適用するなど、API のサブエリアをさらに制御したい場合に適しています。オプション 3 を使用すると、個々のルートをより詳細に制御できるため、ルート内の特定のケースを処理するのに役立ちます。
以上が特定の FastAPI ルートのエラー応答をカスタマイズするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。