Dalam FastAPI, apabila mengesahkan permintaan, jika parameter tiada atau tidak sah, FastAPI menimbulkan pengecualian RequestValidationError. Secara lalai, pengecualian ini mengembalikan respons 422 Entiti Tidak Boleh Diproses. Walau bagaimanapun, anda mungkin mahu menyesuaikan respons ini untuk laluan tertentu. Berikut ialah beberapa pendekatan untuk mencapai ini:
Timpa pengendali pengecualian lalai untuk RequestValidationError dan berikan respons tersuai untuk yang dikehendaki laluan.
from fastapi import FastAPI, Request, status, HTTPException from fastapi.responses import JSONResponse from fastapi.encoders import jsonable_encoder from fastapi.exceptions import RequestValidationError 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)
Buat sub-aplikasi dan lekapkannya pada apl utama untuk laluan tertentu. Gantikan pengendali pengecualian untuk RequestValidationError dalam sub-aplikasi.
from fastapi import FastAPI, RequestValidationError, HTTPException from fastapi.responses import JSONResponse app = FastAPI() subapi = FastAPI() @subapi.exception_handler(RequestValidationError) async def validation_exception_handler(request: Request, exc: RequestValidationError): return JSONResponse(content={'401': 'Unauthorized'}, status_code=401) app.mount('/sub', subapi)
Buat subkelas APIRoute tersuai dan ganti kaedah get_route_handler. Ini membolehkan anda memintas permintaan dan mengendalikan pengecualian RequestValidationError.
from fastapi import FastAPI from fastapi.routing import APIRoute from fastapi.responses import JSONResponse from fastapi.exceptions import RequestValidationError from fastapi.requests import Request class ValidationErrorHandlingRoute(APIRoute): def get_route_handler(self): original_route_handler = super().get_route_handler() async def custom_route_handler(request: Request): try: return await original_route_handler(request) except RequestValidationError as e: return JSONResponse(content={'401': 'Unauthorized'}, status_code=401) 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)
Atas ialah kandungan terperinci Bagaimana untuk Menyesuaikan Respons Ralat FastAPI untuk Laluan Tertentu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!