Какие навыки работы с FastAPI?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Навыки работы с FastAPI
FastAPI — это современный веб-фреймворк на Python для создания REST API. Благодаря встроенной валидации, асинхронности и автоматической генерации документации, он стал популярным выбором для production-систем.
Основы FastAPI
Создание приложения и эндпоинтов — минимальный пример:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
@app.get("/items/{item_id}")
async def get_item(item_id: int):
return {"item_id": item_id}
@app.post("/items/")
async def create_item(item: Item):
return {"name": item.name, "price": item.price}
Типизация параметров — FastAPI использует type hints для валидации. Параметры могут быть:
- Path параметры:
@app.get("/items/{item_id}") - Query параметры:
@app.get("/items/?skip=0&limit=10") - Body параметры: через Pydantic модели
from fastapi import Query, Path, Body
@app.get("/items/")
async def get_items(skip: int = 0, limit: int = 10):
return {"skip": skip, "limit": limit}
@app.get("/items/{item_id}")
async def get_item(
item_id: int = Path(..., gt=0), # gt = greater than
q: str = Query(None, max_length=50)
):
return {"item_id": item_id, "q": q}
Асинхронность и производительность
Async/await синтаксис — FastAPI поддерживает асинхронные функции обработчиков:
import asyncio
from fastapi import FastAPI
app = FastAPI()
@app.get("/users/")
async def get_users():
# Может быть асинхронный DB запрос
await asyncio.sleep(1)
return [{"id": 1, "name": "John"}]
@app.get("/sync-endpoint/")
def sync_endpoint():
# Синхронные операции тоже работают
return {"status": "ok"}
Dependency Injection — встроенная система зависимостей для переиспользования логики:
from fastapi import Depends
async def get_query(q: str = None):
return q
@app.get("/items/")
async def read_items(q: str = Depends(get_query)):
return {"q": q}
Валидация данных с Pydantic
BaseModel для структурирования данных:
from pydantic import BaseModel, Field, validator
from typing import Optional
class User(BaseModel):
id: int
name: str = Field(..., min_length=1, max_length=100)
email: str
age: Optional[int] = None
@validator('email')
def email_must_be_valid(cls, v):
if '@' not in v:
raise ValueError('Invalid email')
return v
@app.post("/users/")
async def create_user(user: User):
return user
Обработка ошибок и исключения
HTTP исключения и кастомные коды ответов:
from fastapi import HTTPException, status
@app.get("/items/{item_id}")
async def get_item(item_id: int):
if item_id < 1:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Item ID must be positive"
)
return {"item_id": item_id}
@app.exception_handler(ValueError)
async def value_error_handler(request, exc):
return JSONResponse(
status_code=400,
content={"detail": str(exc)}
)
Продвинутые возможности
CORS (Cross-Origin Resource Sharing) — для работы с фронтенд-приложениями:
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # Или конкретные домены
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
Middleware для логирования и обработки:
from fastapi.middleware import Middleware
from starlette.middleware.base import BaseHTTPMiddleware
class LoggingMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request, call_next):
response = await call_next(request)
return response
app.add_middleware(LoggingMiddleware)
Автоматическая документация — FastAPI автоматически создаёт Swagger UI и ReDoc на /docs и /redoc.
Развёртывание
ASGI сервер — FastAPI работает на ASGI сервере (например, Uvicorn):
uvicorn main:app --reload # Development
uvicorn main:app --host 0.0.0.0 --port 8000 # Production
Практические советы
- Используйте асинхронность для I/O-bound операций (DB, API запросы)
- Группируйте эндпоинты в APIRouter для лучшей организации
- Используйте background tasks для долгих операций
- Всегда валидируйте входные данные через Pydantic
- Документируйте API примерами в Pydantic моделях
FastAPI идеален для создания быстрых, надёжных и легко масштабируемых API, особенно в контексте микросервисов и ML моделей.