«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как настроить ответы об ошибках для определенных маршрутов FastAPI?

Как настроить ответы об ошибках для определенных маршрутов FastAPI?

Опубликовано 21 декабря 2024 г.
Просматривать:921

How to Customize Error Responses for Specific FastAPI Routes?

Как настроить ответ об ошибке для определенного маршрута в FastAPI

В FastAPI вызов RequestValidationError позволяет отправлять собственный ответ об ошибке. Это полезно для конечных точек, которые требуют выполнения определенных условий, таких как обязательный заголовок.

Вариант 1: переопределить обработчик исключений по умолчанию

Эта опция позволяет переопределить обработчик исключений по умолчанию для 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}),
    )

Вариант 2. Используйте субприложение

Создание субприложения позволяет создать отдельный экземпляр 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)

Вариант 3. Используйте собственный класс APIRoute

Этот метод позволяет изменить поведение определенного маршрута с помощью пользовательского класса 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