في FastAPI، يسمح لك رفع RequestValidationError بإرسال استجابة خطأ مخصصة. يعد هذا مفيدًا لنقاط النهاية التي تتطلب استيفاء شروط محددة، مثل الرأس المطلوب.
يسمح لك هذا الخيار بتجاوز معالج الاستثناء الافتراضي لـ RequestValidationError، مما يسمح لك بتخصيص استجابة الخطأ.
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}), )
يسمح لك إنشاء تطبيق فرعي بإنشاء مثيل API منفصل باستخدام معالج الاستثناء الخاص به. يتيح لك ذلك تخصيص معالجة الأخطاء خصيصًا للتطبيق الفرعي.
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)
تسمح لك هذه الطريقة بتغيير سلوك مسار معين باستخدام فئة APIRoute مخصصة.
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)
الخيار 1 سهل التنفيذ عندما تحتاج فقط إلى تخصيص استجابة الخطأ لمسارات محددة. يعد الخيار 2 مناسبًا عندما تريد مزيدًا من التحكم في المنطقة الفرعية لواجهة برمجة التطبيقات (API) الخاصة بك، مثل تطبيق سياسات أمان مختلفة أو معالجة الاستثناءات. يمنحك الخيار 3 المزيد من التحكم في المسارات الفردية وهو مفيد للتعامل مع حالات محددة داخل المسار.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3