首頁  >  文章  >  後端開發  >  如何在 FastAPI 中自訂特定路由的錯誤回應?

如何在 FastAPI 中自訂特定路由的錯誤回應?

Barbara Streisand
Barbara Streisand原創
2024-11-22 16:18:20156瀏覽

How Can I Customize Error Responses for Specific Routes in FastAPI?

自訂FastAPI 中特定路由的錯誤回應

概述

FastAPI [1](#sources) 提供了多功能平台針對自訂錯誤針對特定路線的回覆。這允許開發人員根據特定的應用程式要求自訂錯誤處理。透過覆蓋預設異常處理程序或採用子應用程式等其他技術,可以建立自訂錯誤回應,增強使用者體驗並提供有意義的回饋

選項 1:覆蓋預設異常處理程序

一種方法涉及覆蓋 RequestValidationError 的預設異常處理程序。當請求包含無效資料時會引發此異常。透過實作自訂處理程序,您可以檢查與所需的自訂標頭相關的特定錯誤,並傳回自訂錯誤回應

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 whether the error relates to the `some_custom_header` parameter
        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}),
    )

選項2:子-應用程式

另一個選擇涉及建立子應用程式安裝它們到主應用程式。這允許特定於子應用程式內的路由的自訂錯誤處理,而不影響主應用程式中的其他路由。

# main API
app = FastAPI()

# sub-application with custom error handling
subapi = FastAPI()
@subapi.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
    # Handle error specific to sub-application's routes
    return JSONResponse(content={'401': 'Unauthorized'}, status_code=401)

# mount sub-application
app.mount('/sub', subapi)

選項 3:自訂 APIRoute 類別

此方法涉及建立一個自訂 APIRoute 類別,用於在 try- except 區塊中處理請求驗證。如果引發 RequestValidationError,則可以傳回自訂錯誤回應。

from fastapi import FastAPI, APIRouter, APIRoute, Request, Header, HTTPException
from fastapi.responses import JSONResponse
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')

# create new router with custom error handling
router = APIRouter(route_class=ValidationErrorHandlingRoute)

# add custom error handling to router
@router.get('/custom')
async def custom_route(some_custom_header: str = Header(...)):
    return {'some-custom-header': some_custom_header}

# add router to app 
app.include_router(router)

結論

透過探索這些技術,開發人員可以在FastAPI 中自訂錯誤回應以滿足特定要求,從而提供更多客製化的使用者體驗和增強的錯誤處理能力。

來源

  1. [FastAPI 文件:處理 HTTP 異常](https://fastapi.tiangolo.com/exception-handlers/)

以上是如何在 FastAPI 中自訂特定路由的錯誤回應?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn