Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menyesuaikan Respons Ralat untuk Laluan FastAPI Tertentu?

Bagaimana untuk Menyesuaikan Respons Ralat untuk Laluan FastAPI Tertentu?

Susan Sarandon
Susan Sarandonasal
2024-11-24 09:59:15286semak imbas

How to Customize Error Responses for Specific FastAPI Routes?

Cara Menyesuaikan Respons Ralat untuk Laluan Tertentu dalam FastAPI

Dalam FastAPI, menaikkan RequestValidationError membolehkan anda menghantar respons ralat tersuai. Ini berguna untuk titik akhir yang memerlukan syarat khusus untuk dipenuhi, seperti Pengepala yang diperlukan.

Pilihan 1: Gantikan pengendali pengecualian lalai

Pilihan ini membolehkan anda mengatasi pengendali pengecualian lalai untuk RequestValidationError, membolehkan anda menyesuaikan respons Ralat.

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}),
    )

Pilihan 2: Gunakan sub-aplikasi

Mencipta sub-aplikasi membolehkan anda mencipta tika API berasingan dengan pengendali pengecualiannya sendiri. Ini membolehkan anda menyesuaikan pengendalian ralat khusus untuk sub-aplikasi.

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)

Pilihan 3: Gunakan kelas APIRoute tersuai

Kaedah ini membolehkan anda menukar gelagat laluan tertentu dengan menggunakan kelas APIRoute tersuai.

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)

Pilihan yang manakah harus anda gunakan?

Pilihan 1 ialah mudah untuk dilaksanakan apabila anda hanya perlu menyesuaikan respons ralat untuk laluan tertentu. Pilihan 2 sesuai apabila anda mahukan lebih kawalan ke atas subkawasan API anda, seperti menggunakan dasar keselamatan yang berbeza atau pengendalian pengecualian. Pilihan 3 memberi anda lebih kawalan ke atas laluan individu dan berguna untuk mengendalikan kes tertentu dalam laluan.

Atas ialah kandungan terperinci Bagaimana untuk Menyesuaikan Respons Ralat untuk Laluan FastAPI Tertentu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn