Название: Асинхронное REST API приложение для управления списками задач
Автор: Корноухов Роман, ПИН-232
Дисциплина: Объектно-ориентированное программирование (4 семестр)
Язык программирования: Python 3.11+
Год создания: 2026
Проект представляет собой асинхронное REST API для управления списками задач (Todo). Приложение построено на современном фреймворке FastAPI с использованием асинхронной БД PostgreSQL через ORM SQLAlchemy.
- ✅ Создание, редактирование и удаление списков задач
- ✅ Создание, редактирование и удаление задач внутри списков
- ✅ Автоматическое ведение счётчиков (всего задач, выполненных)
- ✅ Мягкое удаление (soft delete) - данные не физически удаляются
- ✅ Асинхронная работа с БД для производительности
- ✅ Полная документация API через Swagger UI
- Python 3.11 или выше
- PostgreSQL 12 или выше
- pip или другой менеджер пакетов Python
# 1. Установите зависимости
pip install -r requirements.txt
# 2. Создайте файл .env и установите параметры подключения к БД
cp .env.example .env
# 3. Запуск тестового сервера
uvicorn main:app --reloadПосле запуска приложение будет доступно по адресу: http://127.0.0.1:8000
- Swagger UI: http://127.0.0.1:8000/docs
- ReDoc: http://127.0.0.1:8000/redoc
kornoukhov/
├── main.py # Главный файл с эндпоинтами API
├── models.py # Модели БД (SQLAlchemy ORM)
├── schemas.py # Pydantic-схемы для валидации данных
├── database.py # Конфигурация подключения к БД
├── requirements.txt # Список зависимостей
├── .env # Переменные окружения (создаётся вручную)
├── .gitignore # Git-конфигурация
└── README.md # Этот файл
| Файл | Описание |
|---|---|
| main.py | Основной файл приложения. Содержит определение FastAPI-приложения и все REST API эндпоинты для работы с TodoList и Item. |
| models.py | ORM-модели данных: класс TodoList (список задач) и класс Item (отдельная задача). Определяют структуру таблиц БД. |
| schemas.py | Pydantic-схемы для валидации входящих данных и формирования ответов API. Включает классы Create, Update и Response для каждой сущности. |
| database.py | Конфигурация асинхронного подключения к PostgreSQL. Загружает переменные окружения и инициализирует SQLAlchemy engine и SessionLocal. |
| requirements.txt | Список всех зависимостей Python проекта. |
Возвращает все существующие списки задач, которые не были удалены.
Ответ (200 OK):
[
{
"id": 1,
"name": "Работа",
"items_count": 5,
"completed_count": 2
}
]Возвращает один список задач по ID.
Ответ (200 OK) / 404 Not Found:
{
"id": 1,
"name": "Работа",
"items_count": 5,
"completed_count": 2
}Создаёт новый список задач.
Тело запроса:
{
"name": "Новый список"
}Ответ (201 Created):
{
"id": 2,
"name": "Новый список",
"items_count": 0,
"completed_count": 0
}Обновляет название списка.
Тело запроса:
{
"name": "Обновлённое название"
}Мягко удаляет список (проставляет время удаления, не физически). Возвращает 204 No Content.
Возвращает все задачи, которые не были удалены.
Ответ (200 OK):
[
{
"id": 1,
"todo_list_id": 1,
"name": "Купить хлеб",
"text": "В ближайшем магазине",
"is_done": false
}
]Возвращает одну задачу по ID.
Ответ (200 OK) / 404 Not Found
Создаёт новую задачу в указанном списке. Возвращает 404, если todo_list_id не существует или был удалён.
Тело запроса:
{
"todo_list_id": 1,
"name": "Купить молоко",
"text": "Проверить срок годности",
"is_done": false
}Ответ (201 Created):
{
"id": 2,
"todo_list_id": 1,
"name": "Купить молоко",
"text": "Проверить срок годности",
"is_done": false
}Обновляет поля задачи (все поля опциональны).
Тело запроса:
{
"name": "Обновлённая задача",
"is_done": true
}Мягко удаляет задачу. Возвращает 204 No Content.
Все операции с БД выполняются асинхронно, обеспечивая высокую производительность при работе с множественными запросами.
async def get_all_todolists(db: AsyncSession = Depends(get_db)):
result = await db.execute(...)
return result.scalars().all()Вместо физического удаления записей проставляется временная метка deleted_at. Это позволяет сохранить историю и связность данных.
todo.deleted_at = datetime.now(timezone.utc)Функция update_todo_counters() автоматически пересчитывает количество всех задач и выполненных задач в списке при каждом изменении.
Все входящие данные проверяются по схемам, определённым в schemas.py. FastAPI автоматически генерирует валидные JSON-ответы.
При создании задачи проверяется, что родительский список существует и не был удалён:
todo = await db.get(TodoList, data.todo_list_id)
if not todo or todo.deleted_at is not None:
raise HTTPException(status_code=404, detail="TodoList not found")# 1. Создать список
curl -X POST http://127.0.0.1:8000/todolists \
-H "Content-Type: application/json" \
-d "{\"name\": \"Покупки\"}"
# 2. Создать задачу в списке (ID=1)
curl -X POST http://127.0.0.1:8000/items \
-H "Content-Type: application/json" \
-d "{\"todo_list_id\": 1, \"name\": \"Хлеб\", \"text\": \"Чёрный хлеб\"}"
# 3. Получить все списки
curl http://127.0.0.1:8000/todolists
# 4. Отметить задачу как выполненную
curl -X PATCH http://127.0.0.1:8000/items/1 \
-H "Content-Type: application/json" \
-d "{\"is_done\": true}"Данный проект демонстрирует применение современных подходов к разработке веб-приложений на Python:
- Асинхронное программирование
- REST API архитектура
- ORM и работа с БД
- Валидация данных
- Документирование API
Приложение готово к развёртыванию и может служить базовой платформой для более сложных систем управления задачами.




