19. (П9) Імплементація маршрутів для REST API у Flask¶
Передумови¶
- Прочитана Лекція 18 — Знайомство з Flask. Маршрутизація
- Виконана Практична 8 — Проєктування REST API (специфікація Task Manager API)
- Встановлений Python 3.10+
Завдання¶
Реалізувати REST API для системи управління задачами (Task Manager) на Flask за специфікацією з Практичної 8. API зберігає дані в пам'яті (без бази даних) та підтримує повний набір CRUD-операцій для задач і категорій.
Підготовка проєкту¶
Маршрути для задач¶
| Метод | 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.json—None, повернути400) title— обов'язкове, не порожній рядокstatus— одне зtodo,in_progress,donepriority— одне зlow,medium,highcreated_by— обов'язкове, не порожній рядок
У разі помилки валідації повертати JSON з полем error та кодом 400:
Порядок маршрутів
Маршрут /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