Ответ
FastAPI предоставляет широкие возможности для кастомизации различных аспектов приложения, что позволяет адаптировать его под специфические требования проекта и интегрировать с существующей инфраструктурой.
Основные примеры кастомизации:
-
Кастомные валидаторы Pydantic: Используются для обеспечения целостности данных и применения бизнес-правил, которые не могут быть выражены стандартными типами Pydantic. Это позволяет гибко контролировать входящие данные.
from pydantic import BaseModel, validator class User(BaseModel): name: str @validator('name') def name_must_contain_space(cls, v): if ' ' not in v: raise ValueError('Name must contain a space') return v.title() -
Кастомные Middleware: Позволяют перехватывать запросы и ответы на глобальном уровне, реализуя сквозную функциональность, такую как логирование, аутентификация, добавление заголовков или обработка CORS. Это централизует общую логику.
from fastapi import FastAPI, Request from starlette.responses import Response app = FastAPI() @app.middleware("http") async def add_process_time_header(request: Request, call_next): # Логика до обработки запроса response = await call_next(request) # Логика после обработки запроса response.headers["X-Custom-Header"] = "Custom Value" return response -
Кастомные обработчики ошибок: Используются для предоставления единообразных и информативных ответов при возникновении исключений, улучшая пользовательский опыт и упрощая отладку для клиентов API. Это обеспечивает предсказуемое поведение при ошибках.
from fastapi import FastAPI, HTTPException, Request from fastapi.responses import JSONResponse app = FastAPI() @app.exception_handler(ValueError) async def value_error_handler(request: Request, exc: ValueError): return JSONResponse( status_code=400, content={"message": f"Некорректные данные: {exc}"} ) @app.get("/test-error/{value}") async def test_error(value: str): if value == "invalid": raise ValueError("Значение не может быть 'invalid'") return {"message": "OK"}
Помимо этого, FastAPI позволяет кастомизировать OpenAPI-документацию, систему внедрения зависимостей (Dependency Injection), маршрутизацию и многое другое, что делает его очень гибким и расширяемым фреймворком.