REST API для управления задачами, построенный на FastAPI с асинхронной архитектурой.
- Python 3.13 + FastAPI — асинхронный веб-фреймворк
- SQLAlchemy 2.0 (async) — ORM для работы с БД
- PostgreSQL 16 — основная база данных
- Redis 7 — кеширование данных
- Alembic — миграции базы данных
- Docker + Docker Compose — контейнеризация
- JWT — аутентификация (OAuth2 + Bearer)
- Pydantic v2 — валидация данных
- Pytest — тестирование
Проект построен по слоистой архитектуре:
app/
├── core/ # Инфраструктура (security, middleware, cache, exceptions)
├── models/ # SQLAlchemy ORM-модели
├── repositories/ # Слой доступа к данным (SQL-запросы)
├── schemas/ # Pydantic-схемы (валидация входа/выхода)
├── services/ # Бизнес-логика
├── routers/ # HTTP-эндпоинты
├── config.py # Конфигурация через переменные окружения
├── database.py # Подключение к БД, пул соединений
├── dependencies.py # FastAPI Depends (DI)
└── main.py # Точка входа, lifespan
- Аутентификация — регистрация, логин (JWT), ролевая модель (owner/admin)
- CRUD задач — создание, чтение, обновление, удаление
- Поиск и фильтрация — по статусу, текстовый поиск
- Пагинация — offset/limit с метаданными (total, has_more)
- Кеширование — Redis-кеш для GET-запросов с инвалидацией при изменениях
- Rate limiting — защита эндпоинтов от злоупотреблений (slowapi)
- Background tasks — фоновые задачи (приветственный email при регистрации)
- Миграции — Alembic (автоматически при старте контейнера)
- Тесты — pytest (auth, security)
- Docker и Docker Compose
# Клонировать репозиторий
git clone https://github.com/T4rk123/todo-api.git
cd todo-api
# Создать файл окружения
cp .env.example .env
# Запустить
docker compose up -d --buildAPI доступен по адресу: http://localhost:8000
Swagger-документация: http://localhost:8000/docs
| Метод | Эндпоинт | Описание |
|---|---|---|
| POST | /auth/register |
Регистрация |
| POST | /auth/login |
Логин (получение JWT-токена) |
| Метод | Эндпоинт | Описание |
|---|---|---|
| GET | /tasks/ |
Список задач (пагинация, фильтры) |
| GET | /tasks/stats |
Статистика по задачам |
| GET | /tasks/{id} |
Получить задачу (с кешированием) |
| POST | /tasks/ |
Создать задачу |
| PATCH | /tasks/{id} |
Обновить задачу |
| DELETE | /tasks/{id} |
Удалить задачу |
# Регистрация
curl -X POST http://localhost:8000/auth/register \
-H "Content-Type: application/json" \
-d '{"username": "user", "email": "user@example.com", "password": "secret123"}'
# Логин
curl -X POST http://localhost:8000/auth/login \
-d "username=user@example.com&password=secret123"
# Создать задачу (с токеном)
curl -X POST http://localhost:8000/tasks/ \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"title": "Buy groceries", "description": "Milk, bread, eggs"}'| Переменная | Описание | По умолчанию |
|---|---|---|
DATABASE_URL |
URL подключения к PostgreSQL | — |
REDIS_URL |
URL подключения к Redis | redis://redis:6379 |
SECRET_KEY |
Секрет для подписи JWT | — |
DEBUG |
Режим отладки | true |