21. (П10) Завдання з передачі даних в HTTP-запиті¶
Передумови¶
- Прочитана Лекція 20 — Доступ до даних в HTTP-запиті за допомогою Flask
- Виконана Практична 9 — Імплементація маршрутів для REST API у Flask
- Встановлений Python 3.10+
Персоналізація
У всіх запитах, де передається поле created_by, повинно бути ваше ім'я та прізвище. Заголовок X-User також повинен містити ваше ім'я та прізвище. На скріншотах у звіті повинно бути видно ваше ім'я.
Завдання¶
Розширити Task Manager API з Практичної 9 новими endpoint-ами, які демонструють різні способи передачі даних в HTTP-запиті: query-параметри з пагінацією, дані форм, завантаження файлів та робота із заголовками.
Підготовка проєкту¶
Продовжуйте роботу в проєкті з Практичної 9. Якщо потрібно почати з нуля:
Додайте директорію для завантажених файлів:
Частина 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)
Формат відповіді з пагінацією:
Частина 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:
Перевірка розширення файлу
Завжди перевіряйте розширення файлу на стороні сервера. Клієнт може надіслати файл з будь-яким розширенням, тому не покладайтесь лише на 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.
- DELETE
/api/tasks/<id>— оновіть існуючий маршрут видалення: тепер перед видаленням перевіряйте заголовокX-User. Видалити задачу може лише її автор (created_by). Якщо заголовок відсутній —401. ЯкщоX-Userне збігається зcreated_byзадачі —403.
Відповіді помилок:
Тестування через 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