Веселое и интерактивное Fullstack-приложение на Python и Flask. Этот проект демонстрирует создание веб-интерфейса с ярким дизайном, анимациями на CSS, интерактивностью на JavaScript и надежным бэкендом.
- Интерактивная форма: Валидация данных прямо в браузере (HTML5).
- Яркий дизайн: Кастомные стили, анимации, "покачивания" заголовка и "прыгающие" кнопки.
- JavaScript Пасхалки: Убегающая кнопка-сюрприз и динамический предпросмотр цвета
- Умный Бэкенд:
- Генерация случайных шуток на основе данных пользователя.
- Обработка ошибок (404, 500).
- Система логирования событий и ошибок в файлы
app.logиerror.log. - Автоматические тесты для проверки работоспособности.
flask_form_project/
└── logging_module/
├── my_logger_config.py # Модуль с настройками логирования и инициализацией логгеров
├── my_logging_config.yaml # YAML-файл конфигурации для логирования
└── my_color_formatter.py # Кастомный форматтер для цветного вывода логов в консоль
└── logs/ # Директория для логов
└── general # Директория с файлами для логов
├── app.log # Информационные логи приложения
└── error.log # Логи ошибок и исключений
└── app/ # Директория с файлами программы
└── static/ # Директория со статическими файлами
└── css/ # Папка для CSS-файлов
├── styles.css # Статический CSS-файл
├── templates/ # Директория с HTML-шаблонами
├── base.html # Базовый шаблон (используется во всех остальных)
├── error.html # Шаблон ошибки
├── form.html # Шаблон формы
├── result.html # Шаблон с результатом
├── __init__.py # Инициализация приложения
├── routes.py # Файл с маршрутами
└── tests/ # Директория с файлом для тестирования приложения
├── test_routes.py # Автоматизированные тесты для проверки маршрутов
├── run.py # Запуск программы
└── requirements.txt # Список библиотек необходимых для работы программы
- Backend: Python 3, Flask, Jinja2
- Frontend: HTML5, CSS3, JavaScript
- Тестирование: Pytest (Современный фреймворк для тестирования Python)
- Логирование: Модульная система на базе Python
logging, конфигурация через YAML, кастомный цветной форматтер для консоли.
Python 3.10+Flask 3+pytest(для тестирования)PyYAML(для загрузки конфигурации логирования)Colorama- (для цветного вывода логов в консоль)
- Клонировать репозиторий:
git clone <URL_РЕПОЗИТОРИЯ>
cd <ИМЯ_ПАПКИ_ПРОЕКТА>
- Установить необходимые библиотеки (инструкцию см. ниже).
- Запустить приложение:
python run.py
- В командной строке или окне терминала ввести команду
- Нажать кнопку Enter
pip install -r requirements.txt- Для установки всех библиотек
Приложение реализует комплексную систему логирования, которая:
- Записывает все события приложения и ошибки.
- Использует различные уровни логирования (INFO, WARNING, ERROR, DEBUG, CRITICAL).
- Обеспечивает цветной вывод в консоль для лучшей читаемости.
- Хранит логи в отдельных файлах(app.log для общей информации, error.log для ошибок) в общей директории
logs/.
- app.log: Содержит общую информацию о работе приложения, включая действия пользователя, успешное выполнение запросов к API и информационные сообщения.
- error.log: Записывает все сообщения уровня
ERRORи выше.
Настройка системы логирования осуществляется через следующие файлы:
- my_logger_config.py: Настраивает конфигурацию логирования
- my_logging_config.yaml: Конфигурация для различных логгеров
- my_color_formatter.py: Кастомный форматтер для цветного вывода в консоль
Для обеспечения стабильности приложения проект покрыт автоматическими тестами на базе фреймворка pytest.
Тесты проверяют доступность страниц, корректность работы маршрутов и логику обработки данных.
Тесты можно запустить из командной строки:
pytest- Краткий вариант результатов тестированияpytest -v- Более детальный вывод результатов тестирования
Также файл с тестированием можно запустить как и обычный код, через кнопку run.
- Тест проверяет корректную обработку POST-запроса(отправку формы)
def test_submit_form_success(client):
"""
Проверяет успешную обработку формы с валидными данными.
Выполняет POST-запрос с корректным именем и email.
Ожидает код 200 и наличие имени пользователя в ответе.
:param client: Фикстура тестового клиента.
"""
test_data = {'name': 'Ivan', 'email': 'ivan@example.com'}
response = client.post('/submit', data=test_data, follow_redirects=True)
assert response.status_code == 200
# Проверяем, что на странице результата отобразилось имя с помощью декодировки
assert "Ivan" in response.data.decode('utf-8')- Тест проверяет обработку запроса к несуществующему маршруту
def test_page_not_found(client):
"""
Проверяет обработку запроса к несуществующему маршруту.
Выполняет запрос по случайному адресу и ожидает статус-код 404
с соответствующим сообщением об ошибке на странице.
:param client: Фикстура тестового клиента.
"""
response = client.get('/some_non_existent_page')
assert response.status_code == 404
assert "Страница потерялась в космосе" in response.data.decode('utf-8')