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