2 семестр / Лабораторные работы / Задание_2 лаб раб (Flask)
.docxПрактическое задание по Flask
Разработка веб-приложения "Блог"
Задание
На основе кода, разработанного на лекции, необходимо создать собственное веб-приложение "Блог" с расширенным функционалом. Запрещено сдавать приложение, полностью идентичное лекционному примеру. Вы должны выбрать одно из пяти направлений развития и реализовать его, а также добавить индивидуальные особенности.
Вариант 1. Категории и теги
Добавить систему категорий и тегов для постов.
Обязательный минимум:
Таблица categories (id, name, description, created_at)
Таблица tags (id, name)
Связь многие-ко-многим между постами и тегами
Возможность выбирать категорию и добавлять теги при создании/редактировании поста
Фильтрация постов по категории на главной странице
Облако тегов (список всех тегов с количеством постов)
Дополнительные баллы:
Поиск по тегам (вывод всех постов с выбранным тегом)
Иерархические категории (родитель-потомок)
Хлебные крошки (breadcrumbs) для навигации по категориям
Вариант 2. Комментарии и лайки
Добавить систему комментариев и реакций на посты.
Обязательный минимум:
Таблица comments (id, post_id, author_name, author_email, content, created_at, is_approved)
Форма добавления комментария под постом (имя, email, текст)
Капча или простейшая защита от спама (например, вопрос "Сколько будет 2+2?")
Модерация комментариев (поле is_approved, показывать только одобренные)
Счетчик комментариев на главной странице
Дополнительные баллы:
Система лайков/дизлайков для постов
Ответы на комментарии (вложенные комментарии)
Gravatar (аватарки по email)
Уведомление автора поста о новом комментарии по email
Вариант 3. Авторизация и пользователи
Добавить систему регистрации и авторизации с разграничением прав.
Обязательный минимум:
Таблица users (id, username, email, password_hash, created_at, is_admin)
Регистрация с хешированием пароля (использовать werkzeug.security)
Вход и выход (логин/логаут)
Сессии пользователей
Привязка постов к пользователю (поле author_id)
Только автор может редактировать/удалять свой пост
Дополнительные баллы:
Восстановление пароля через email
Профиль пользователя со списком его постов
Администратор (может редактировать/удалять любые посты)
Роли пользователей (админ, модератор, автор, читатель)
Вариант 4. Загрузка изображений
Добавить возможность прикреплять изображения к постам.
Обязательный минимум:
Поле image в таблице posts (путь к файлу)
Загрузка изображения через форму создания/редактирования поста
Валидация типа и размера файла (только jpg, png, gif; не более 5MB)
Безопасное сохранение файлов (уникальное имя, проверка расширения)
Отображение изображения на странице поста
Миниатюры (thumbnails) на главной странице
Дополнительные баллы:
Галерея изображений (несколько картинок на пост)
Автоматическое изменение размера (resize) для миниатюр
Водяные знаки на изображениях
Drag-and-drop загрузка файлов
Вариант 5. REST API
Добавить программный интерфейс для доступа к блогу.
Обязательный минимум:
Эндпоинты API (использовать jsonify):
GET /api/posts — список всех постов (в формате JSON)
GET /api/posts/<id> — конкретный пост
POST /api/posts — создание нового поста (принимает JSON)
PUT /api/posts/<id> — обновление поста
DELETE /api/posts/<id> — удаление поста
Аутентификация через API-ключ или токен
Документация API (в README или отдельной странице /api/docs)
Обработка ошибок с правильными HTTP-кодами
Дополнительные баллы:
Пагинация для GET /api/posts
Фильтрация и сортировка
Rate limiting (ограничение количества запросов)
Swagger-документация
Индивидуальные особенности (обязательно для всех вариантов)
Вне зависимости от выбранного варианта, вы должны добавить минимум два из следующих улучшений:
Поиск — строка поиска на главной странице, ищущая по заголовку и содержанию
Пагинация — разбиение списка постов на страницы (например, по 5 постов на страницу)
RSS-лента — /rss с последними 10 постами в формате RSS
Sitemap.xml — /sitemap.xml для поисковых систем
Статистика — отдельная страница со статистикой (количество постов, комментариев, пользователей)
Экспорт — кнопка "Экспорт в CSV" для выгрузки постов
Черновики — возможность сохранить пост как черновик (поле published), не показывать на главной
Плагин для синтаксиса кода — подсветка кода в постах (например, с помощью highlight.js)
Требования к реализации
Технические требования
Python 3.9+ и Flask 2.x
SQLite для хранения данных
Bootstrap 5 для интерфейса (можно использовать другую тему)
Jinja2 для шаблонов
Git для контроля версий
Архитектурные требования
Чистый код — соблюдение PEP 8, осмысленные имена переменных
Комментарии — docstring для всех функций и сложных мест
Модульность — разделение на отдельные файлы (если код большой)
Обработка ошибок — try-except где необходимо, 404 для несуществующих постов
Валидация — проверка всех пользовательских данных
Требования к интерфейсу
Адаптивный дизайн (должен хорошо выглядеть на мобильных)
Навигационная панель с ссылками на все разделы
Flash-сообщения об успехе/ошибке
Подтверждение перед удалением
Интуитивно понятные формы
Структура отчёта
Отчёт оформляется в виде Jupyter Notebook с расширением .ipynb и должен содержать:
1. Титульный лист
Название работы
ФИО студента
Группа
Вариант задания
Дата
2. Описание проекта
Какой вариант выбран и почему
Какие индивидуальные особенности добавлены
Скриншоты готового приложения (главная, страница поста, форма создания)
3. Структура базы данных
Схема таблиц (можно в виде SQL-кода или диаграммы)
Описание полей и связей
4. Ключевые фрагменты кода
Не нужно вставлять весь код, только самое интересное:
Новые маршруты
Сложные SQL-запросы
Валидация форм
Работа с файлами (если есть)
5. Инструкция по установке и запуску
git clone <ваш-репозиторий>
cd <папка-проекта>
python -m venv venv
source venv/bin/activate # для Linux/Mac
# venv\Scripts\activate # для Windows
pip install -r requirements.txt
python init_db.py
flask run
6. Тестирование
Какие тесты проводились
Скриншоты работы всех функций
7. Проблемы и их решение
С какими трудностями столкнулись
Как их преодолели
8. Выводы
Чему научились
Что можно улучшить
Оценка сложности
Формат сдачи
GitHub-репозиторий (обязательно):
Все файлы проекта
Файл requirements.txt со всеми зависимостями
README.md с описанием проекта и инструкцией по запуску
.gitignore (исключить venv/, __pycache__/, *.pyc, database.db)
Jupyter Notebook с отчётом
Ссылка на рабочее приложение (если разместили на хостинге)
Полезные ресурсы
Документация Flask
Документация Jinja2
Документация Bootstrap 5
Flask-WTF
Flask-Login
Flask-Uploads
SQLite документация
