Skip to content

19. (П9) Імплементація маршрутів для REST API у Flask

Передумови

Завдання

Реалізувати REST API для системи управління задачами (Task Manager) на Flask за специфікацією з Практичної 8. API зберігає дані в пам'яті (без бази даних) та підтримує повний набір CRUD-операцій для задач і категорій.

Підготовка проєкту

mkdir task-manager && cd task-manager
python3 -m venv env
source env/bin/activate
pip install flask

Маршрути для задач

Метод URL Опис Коди відповідей
GET /api/tasks Список усіх задач 200
POST /api/tasks Створити задачу 201, 400
GET /api/tasks/<id> Отримати задачу за ID 200, 404
PUT /api/tasks/<id> Оновити задачу 200, 400, 404
DELETE /api/tasks/<id> Видалити задачу 204, 404
GET /api/tasks/stats Статистика по задачах 200

Вимоги:

  • GET /api/tasks — повертає список усіх задач. Підтримує фільтрацію через query-параметри status (todo, in_progress, done) та priority (low, medium, high). Приклад: GET /api/tasks?status=todo&priority=high.

  • POST /api/tasks — створює нову задачу. Обов'язкові поля: title, status, priority, created_by. Поле id генерується автоматично. Поле created_at встановлюється автоматично (поточна дата та час в ISO 8601). Необов'язкове поле category_id — зв'язок з категорією. Повертає створену задачу з кодом 201.

  • GET /api/tasks/<id> — повертає задачу за ID або 404 з JSON-повідомленням про помилку.

  • PUT /api/tasks/<id> — оновлює лише ті поля задачі, які передані в тілі запиту. Повертає оновлену задачу або 404.

  • DELETE /api/tasks/<id> — видаляє задачу. Повертає порожнє тіло з кодом 204 або 404.

  • GET /api/tasks/stats — повертає статистику: загальну кількість задач, кількість за кожним статусом та пріоритетом.

Валідація при створенні (POST):

  • Тіло запиту має бути JSON (якщо request.jsonNone, повернути 400)
  • title — обов'язкове, не порожній рядок
  • status — одне з todo, in_progress, done
  • priority — одне з low, medium, high
  • created_by — обов'язкове, не порожній рядок

У разі помилки валідації повертати JSON з полем error та кодом 400:

{"error": "Поле 'title' є обов'язковим"}

Порядок маршрутів

Маршрут /api/tasks/stats повинен бути оголошений перед маршрутом /api/tasks/<int:task_id>, інакше Flask інтерпретує stats як ID задачі. Оскільки конвертер int відхилить рядок stats, помилки не буде, але це хороша практика — ставити статичні маршрути перед динамічними.

Маршрути для категорій

Метод URL Опис Коди відповідей
GET /api/categories Список усіх категорій 200
POST /api/categories Створити категорію 201, 400
GET /api/categories/<id>/tasks Задачі у категорії 200, 404

Вимоги:

  • POST /api/categories — обов'язкове поле: name. Повертає створену категорію з кодом 201.
  • GET /api/categories/<id>/tasks — повертає задачі, у яких category_id відповідає ID категорії. Якщо категорію не знайдено — 404.

Тестування через curl

За допомогою curl команд переконатися, що:

  • Створення задач і категорій повертає 201 з коректними даними
  • Фільтрація за status та priority працює
  • Отримання неіснуючого ресурсу повертає 404 з JSON-помилкою
  • Оновлення змінює лише передані поля
  • Видалення повертає 204
  • Валідація повертає 400 з описом помилки
  • Статистика коректно підраховує задачі
  • Задачі у категорії повертають правильний набір

Результат

Після виконання роботи студент здає:

  • app.py — Flask-застосунок з усіма маршрутами
  • Звіт зі списоком curl команд використаних для тестування

Персоналізація

У всіх запитах, де передається поле created_by, повинно бути ваше ім'я та прізвище. Відповіді API також повинні містити ваше ім'я у відповідних полях. На скріншотах в звіті повинно бути видно ваше ім'я


Знайшли помилку чи бажаєте додати інформацію, щоб покращити курс? Створіть issue на GitHub