Skip to content

21. (П10) Завдання з передачі даних в HTTP-запиті

Передумови

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

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

Завдання

Розширити Task Manager API з Практичної 9 новими endpoint-ами, які демонструють різні способи передачі даних в HTTP-запиті: query-параметри з пагінацією, дані форм, завантаження файлів та робота із заголовками.

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

Продовжуйте роботу в проєкті з Практичної 9. Якщо потрібно почати з нуля:

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

Додайте директорію для завантажених файлів:

mkdir uploads

Частина 1: Розширена фільтрація та пагінація (query-параметри)

Замініть існуючий маршрут GET /api/tasks новою версією з підтримкою пагінації та пошуку.

Метод URL Опис Коди відповідей
GET /api/tasks Список задач з фільтрацією, пагінацією та пошуком 200

Вимоги:

  • Фільтрація за status та priority (як у Практичній 9)
  • Пошук за ключовим словом у title через query-параметр q (регістронезалежний, часткове входження). Приклад: GET /api/tasks?q=flask
  • Пагінація через параметри page (за замовчуванням 1) та limit (за замовчуванням 5). Обидва параметри мають бути цілими числами (використовуйте type=int)

Формат відповіді з пагінацією:

{
    "tasks": [...],
    "pagination": {
        "page": 1,
        "limit": 5,
        "total": 12,
        "pages": 3
    }
}

Частина 2: Форма зворотного зв'язку (дані форми)

Метод URL Опис Коди відповідей
GET /feedback HTML-сторінка з формою 200
POST /feedback Обробка даних форми 201, 400
GET /api/feedback Список усіх відгуків (JSON) 200

Вимоги:

  • GET /feedback — повертає HTML-сторінку з формою зворотного зв'язку. Форма повинна містити поля:

    • name — ім'я (текстове поле, обов'язкове)
    • email — електронна пошта (текстове поле, обов'язкове)
    • message — повідомлення (textarea, обов'язкове)
  • POST /feedback — обробляє дані форми через request.form. Валідує, що name, email та message не порожні. Зберігає відгук у пам'яті та повертає HTML-сторінку з підтвердженням.

  • GET /api/feedback — повертає список усіх відгуків у форматі JSON.

Частина 3: Завантаження файлів

Метод URL Опис Коди відповідей
POST /api/tasks/<id>/attachment Додати файл до задачі 201, 400, 404

Вимоги:

  • Якщо задачу не знайдено — 404
  • Якщо файл не надіслано або ім'я файлу порожнє — 400
  • Дозволені розширення: .txt, .pdf, .png, .jpg. Інші — 400
  • Файл зберігається у директорію uploads/
  • Інформація про файл зберігається у задачі (ім'я файлу, тип)

Відповідь (201):

{
    "message": "File uploaded",
    "filename": "report.pdf",
    "content_type": "application/pdf",
    "task_id": 1
}

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

curl -X POST http://127.0.0.1:5000/api/tasks/1/attachment \
  -F "file=@report.pdf"

Перевірка розширення файлу

Завжди перевіряйте розширення файлу на стороні сервера. Клієнт може надіслати файл з будь-яким розширенням, тому не покладайтесь лише на Content-Type.

Частина 4: Авторизація через заголовки

Метод URL Опис Коди відповідей
GET /api/tasks/my Задачі поточного користувача 200, 401
DELETE /api/tasks/<id> Видалити задачу (тільки автор) 204, 401, 403, 404

Вимоги:

  • GET /api/tasks/my — повертає задачі, де created_by збігається з ім'ям із заголовка X-User. Якщо заголовок відсутній — повертає 401.
curl http://127.0.0.1:5000/api/tasks/my \
  -H "X-User: Ім'я Прізвище"
  • DELETE /api/tasks/<id> — оновіть існуючий маршрут видалення: тепер перед видаленням перевіряйте заголовок X-User. Видалити задачу може лише її автор (created_by). Якщо заголовок відсутній — 401. Якщо X-User не збігається з created_by задачі — 403.

Відповіді помилок:

{"error": "Header 'X-User' is required"}
{"error": "You can only delete your own tasks"}

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

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

  • Пагінація повертає правильну кількість задач та метадані (page, limit, total, pages)
  • Пошук ?q=... фільтрує задачі за назвою
  • Комбінація фільтрів працює: ?status=todo&q=flask&page=1&limit=2
  • Форма зворотного зв'язку працює через браузер та через curl
  • Завантаження файлу зберігається в uploads/ та прив'язується до задачі
  • Файл із забороненим розширенням відхиляється з кодом 400
  • GET /api/tasks/my повертає задачі лише поточного користувача
  • DELETE без заголовка X-User повертає 401, з чужим ім'ям — 403

Результат

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

  • app.py — Flask-застосунок з усіма маршрутами (з Практичної 9 + нові)
  • Звіт зі списком curl команд, використаних для тестування кожної частини та обов'язково скріншоти виконання команд

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