Bagaimana untuk Menyesuaikan Respons Ralat untuk Laluan Tertentu dalam FastAPI?

Barbara Streisand
Lepaskan: 2024-11-20 00:54:03
asal
542 orang telah melayarinya

How to Customize Error Responses for Specific Routes in FastAPI?

Cara Menyesuaikan Respons Ralat untuk Laluan Tertentu dalam FastAPI

Dalam FastAPI, anda boleh menyesuaikan respons ralat untuk laluan tertentu dengan mengatasi pengendali pengecualian untuk RequestValidationError. Berikut ialah beberapa pilihan:

Pilihan 1 (Mudah)

Jika anda tidak keberatan mempunyai Pengepala muncul sebagai Pilihan dalam dokumentasi OpenAPI, anda boleh menggunakan kod berikut:

from fastapi import Header, HTTPException

@app.post("/")
def some_route(some_custom_header: Optional[str] = Header(None)):
    if not some_custom_header:
        raise HTTPException(status_code=401, detail="Unauthorized")
    return {"some-custom-header": some_custom_header}
Salin selepas log masuk

Pilihan 2 (Pengecualian Tersuai Pengendali)

Untuk memaparkan Pengepala seperti yang diperlukan dalam dokumentasi OpenAPI, anda boleh mengatasi pengendali pengecualian:

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 for the specific Header in the errors
        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}),
    )

@app.get("/")
def some_route(some_custom_header: str = Header(...)):
    return {'some-custom-header': some_custom_header}
Salin selepas log masuk

Pilihan 3 (Sub-Aplikasi)

Anda boleh membuat sub-aplikasi dan melekapkannya ke apl utama. Ini akan membolehkan anda menyesuaikan pengendali pengecualian hanya untuk laluan yang ditakrifkan dalam subaplikasi:

from fastapi import FastAPI, Request, Header
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get('/')
async def main():
    return {'message': 'Hello from main API'}
    

subapi = FastAPI()
   
@subapi.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
    # Custom exception handling
    return JSONResponse(content={'401': 'Unauthorized'}, status_code=401)


@subapi.get('/')
async def sub_api_route(some_custom_header: str = Header(...)):
    return {'some-custom-header': some_custom_header}    


app.mount('/sub', subapi)
Salin selepas log masuk

Pilihan 4 (Penghala API Tersuai dan Pengendalian Pengecualian)

Anda boleh menggunakan kelas APIRouter tersuai dan mengendalikan pengecualian dalam blok try-except:

from fastapi import FastAPI, APIRouter, Response, Request, Header, HTTPException
from fastapi.responses import JSONResponse
from fastapi.exceptions import RequestValidationError
from fastapi.routing import APIRoute
from typing import Callable

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:
                # Custom exception handling
                raise HTTPException(status_code=401, detail='401 Unauthorized')
                            
        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)
Salin selepas log masuk

Pilih pilihan yang paling sesuai dengan keperluan anda.

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

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan