Виконала: Ткачук Евеліна Група: ІПЗ-32 Дата виконання: 17.12.2025
- Мета роботи
- Завдання
- Теоретичні відомості
- Обладнання та програмне забезпечення
- Хід роботи
- Приклади роботи API веб-застосунку
- Аналіз виконаної роботи
- Висновки
- Список використаних джерел
Метою роботи є набуття практичних навичок проєктування та реалізації REST API веб-застосунків із використанням сучасних веб-фреймворків, формування розуміння клієнт-серверної архітектури, а також ознайомлення з підходами до інтеграції серверної логіки з шаблонізатором та реалізації механізмів автентифікації та авторизації користувачів.
Для отримання оцінки "відмінно" необхідно реалізувати:
-
Базовий REST API для роботи з однією сутністю предметної області (нотатки):
- Контролери з ендпоінтами для CRUD-операцій
- Використання стандартних HTTP-методів (GET, POST, PUT, DELETE)
- Відповіді у форматі JSON
- Коректна обробка HTTP-статусів (200, 201, 400, 403, 404)
-
Веб-інтерфейс з інтеграцією шаблонізатора:
- HTML-сторінки для взаємодії з REST API
- Використання шаблонізатора Jinja2
- Багатошарова архітектура (controller, service, repository, model)
-
Механізми автентифікації та авторизації:
- Дві ролі користувачів (USER та ADMIN)
- Різні права доступу до ендпоінтів
- Автентифікація на основі форми входу
- Збереження користувачів у базі даних
- Шифрування паролів
REST (Representational State Transfer) — архітектурний стиль взаємодії компонентів розподіленої системи у комп'ютерній мережі. REST є узгодженим набором обмежень, що враховуються при проєктуванні розподіленої гіпермедіа-системи.
Основні принципи REST:
- Клієнт-серверна архітектура
- Відсутність стану (stateless)
- Кешування
- Єдиний інтерфейс
- Багатошарова система
HTTP методи в REST:
- GET — отримання ресурсу
- POST — створення нового ресурсу
- PUT — оновлення існуючого ресурсу
- DELETE — видалення ресурсу
Багатошарова архітектура дозволяє організувати код у логічні шари, кожен з яких має свою відповідальність:
- Controller (Контролер) — обробка HTTP-запитів, валідація вхідних даних, формування відповідей
- Service (Сервіс) — бізнес-логіка додатку, обробка даних
- Repository (Репозиторій) — доступ до бази даних, CRUD операції
- Model (Модель) — представлення даних, сутності БД
Автентифікація — процес перевірки ідентичності користувача (хто ви?).
Авторизація — процес перевірки прав доступу користувача (що ви можете робити?).
Flask-Login — розширення Flask для управління сесіями користувачів.
Bcrypt — криптографічний алгоритм для хешування паролів з використанням солі.
Jinja2 — сучасний та зручний шаблонізатор для Python. Він дозволяє:
- Відокремити логіку від представлення
- Використовувати змінні та цикли в HTML
- Наслідувати шаблони
- Створювати компоненти для повторного використання
- Персональний комп'ютер
- Процесор: багатоядерний
- Оперативна пам'ять: 8 ГБ або більше
- Вільне місце на диску: 2 ГБ
- Операційна система: Linux (Ubuntu/Debian)
- Мова програмування: Python 3.12
- Веб-фреймворк: Flask 3.0.0
- ORM: SQLAlchemy 2.0.45
- База даних: SQLite
- Інші бібліотеки:
- Flask-Login 0.6.3 (автентифікація)
- Flask-Bcrypt 1.0.1 (хешування паролів)
- python-dotenv 1.0.0 (змінні оточення)
- IDE: Visual Studio Code / PyCharm
- Інструменти тестування: curl, веб-браузер
- Система контролю версій: Git
Проєкт організовано згідно з багатошаровою архітектурою:
IPZ/
├── app/
│ ├── __init__.py # Ініціалізація Flask
│ ├── models/ # Моделі даних
│ │ ├── user.py # Модель користувача
│ │ └── note.py # Модель нотатки
│ ├── repositories/ # Репозиторії
│ │ ├── user_repository.py
│ │ └── note_repository.py
│ ├── services/ # Бізнес-логіка
│ │ ├── user_service.py
│ │ └── note_service.py
│ ├── controllers/ # Контролери
│ │ ├── api_controller.py # REST API
│ │ └── web_controller.py # Веб-інтерфейс
│ ├── templates/ # HTML шаблони
│ └── static/ # Статичні файли (CSS)
├── config.py # Конфігурація
├── run.py # Точка входу
└── requirements.txt # Залежності
Створено дві основні моделі з використанням SQLAlchemy ORM:
Модель User:
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password_hash = db.Column(db.String(255), nullable=False)
role = db.Column(db.String(20), nullable=False, default='USER')
created_at = db.Column(db.DateTime, default=db.func.current_timestamp())
notes = db.relationship('Note', backref='author', cascade='all, delete-orphan')Модель Note:
class Note(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(200), nullable=False)
content = db.Column(db.Text, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
created_at = db.Column(db.DateTime, default=db.func.current_timestamp())
updated_at = db.Column(db.DateTime, onupdate=db.func.current_timestamp())Repository забезпечує доступ до бази даних та інкапсулює CRUD операції:
create()— створення нового записуfind_by_id()— пошук за IDfind_all()— отримання всіх записівupdate()— оновлення записуdelete()— видалення запису
Service містить бізнес-логіку та валідацію:
- Валідація вхідних даних
- Перевірка унікальності username/email
- Хешування паролів через bcrypt
- Автентифікація користувачів
- Перевірка прав доступу
Створено повний набір REST API ендпоінтів:
Для нотаток:
GET /api/notes— список нотатокGET /api/notes/<id>— отримати нотаткуPOST /api/notes— створити нотаткуPUT /api/notes/<id>— оновити нотаткуDELETE /api/notes/<id>— видалити нотатку
Для користувачів (тільки ADMIN):
GET /api/users— список користувачівGET /api/users/<id>— отримати користувачаPOST /api/users— створити користувачаDELETE /api/users/<id>— видалити користувача
Інше:
GET /api/me— інформація про поточного користувачаGET /api/stats— статистика (тільки ADMIN)
Створено HTML сторінки з використанням Jinja2:
- login.html — форма входу
- register.html — форма реєстрації
- notes.html — список нотаток
- note_form.html — створення/редагування нотатки
- admin.html — адміністраторська панель
- base.html — базовий шаблон
Автентифікація:
- Використано Flask-Login для управління сесіями
- Паролі хешуються з bcrypt перед збереженням
- Форма входу з валідацією
Авторизація:
- Дві ролі: USER та ADMIN
- Декоратори
@login_requiredта@admin_required - USER бачить тільки свої нотатки
- ADMIN має доступ до всіх нотаток та управління користувачами
Створено сучасний дизайн з використанням:
- Glassmorphism ефекти
- Темна тема з градієнтами
- Анімації (float, shimmer, pulse)
- Адаптивний дизайн
- Інтерактивні елементи
Опис: Форма входу з Glassmorphism дизайном, градієнтним заголовком та анімованим фоном.
Опис: Форма реєстрації з валідацією полів (мінімум 3 символи для username, 6 для пароля).
Опис: Користувач з роллю USER бачить тільки свої нотатки. Картки нотаток з float анімацією, при наведенні піднімаються та світяться.
Опис: Форма створення нотатки з валідацією. При фокусі поля анімуються.
Опис: Панель адміністратора з статистикою (shimmer ефект), таблицями користувачів та нотаток.
Опис: Адміністратор бачить нотатки всіх користувачів, включаючи автора кожної нотатки.
У результаті виконання лабораторної роботи №3 було успішно розроблено REST API веб-застосунок для управління нотатками з використанням Python Flask.
Набуті практичні навички:
-
Проєктування REST API:
- Розуміння принципів REST архітектури
- Використання стандартних HTTP методів
- Коректна обробка HTTP статусів
- Проєктування структури JSON відповідей
-
Реалізація багатошарової архітектури:
- Розділення коду на логічні шари
- Організація відповідальностей
- Створення масштабованої структури
- Дотримання принципів SOLID
-
Робота з ORM:
- Визначення моделей даних
- Створення зв'язків між таблицями
- Виконання запитів через SQLAlchemy
- Міграція схеми бази даних
-
Реалізація автентифікації та авторизації:
- Використання Flask-Login
- Хешування паролів з bcrypt
- Організація ролей користувачів
- Захист ендпоінтів
-
Інтеграція з шаблонізатором:
- Використання Jinja2
- Серверний рендеринг HTML
- Передача даних у шаблони
- Наслідування шаблонів
-
Розробка сучасного UI:
- Створення Glassmorphism дизайну
- Реалізація CSS анімацій
- Адаптивний дизайн
- UX оптимізація
Відповідність вимогам:
Застосунок повністю відповідає вимогам для оцінки "відмінно":
✅ Реалізовано базовий REST API з CRUD операціями
✅ Використовуються стандартні HTTP методи
✅ Відповіді у форматі JSON
✅ Коректна обробка HTTP статусів
✅ Реалізовано веб-інтерфейс з Jinja2
✅ Багатошарова архітектура (Controller-Service-Repository-Model)
✅ Автентифікація користувачів
✅ Авторизація з ролями (USER/ADMIN)
✅ Хешування паролів (bcrypt)
✅ Збереження даних у базі даних
Практична цінність:
Розроблений застосунок демонструє:
- Розуміння сучасних веб-технологій
- Вміння організовувати код за принципами Clean Architecture
- Знання основ безпеки веб-застосунків
- Навички роботи з базами даних
- Досвід створення REST API
- Розуміння клієнт-серверної архітектури
Отримані знання та навички будуть корисні при розробці реальних веб-застосунків та можуть бути застосовані у професійній діяльності.
- Flask Documentation. URL: https://flask.palletsprojects.com/
- SQLAlchemy Documentation. URL: https://docs.sqlalchemy.org/
- Flask-Login Documentation. URL: https://flask-login.readthedocs.io/
- REST API Tutorial. URL: https://restfulapi.net/
- MDN Web Docs - HTTP. URL: https://developer.mozilla.org/en-US/docs/Web/HTTP
- OWASP Security Guidelines. URL: https://owasp.org/
- Python Documentation. URL: https://docs.python.org/3/
- Jinja2 Documentation. URL: https://jinja.palletsprojects.com/
- Bcrypt Documentation. URL: https://pypi.org/project/bcrypt/
- Clean Architecture Principles by Robert C. Martin








