Skip to content

lor2ex/Film_Search_Project

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🎬 Film Search Project - Полнофункциональное веб-приложение

Современное веб-приложение для поиска фильмов из базы данных Sakila с интеграцией TMDB API, умной системой постеров, логированием в MongoDB и продвинутой аналитикой.

Python FastAPI MySQL MongoDB


📋 Оглавление


✨ Возможности

🔍 Поиск фильмов

  • По названию - поиск с постраничной навигацией (10 фильмов на странице)
  • По жанру и году - фильтрация с автоматическим определением доступного диапазона лет
  • По актёру - поиск фильмов с участием конкретного актёра (отображение имени, а не ID)

🖼️ Умная система постеров

  • TMDB API интеграция - настоящие постеры фильмов в высоком качестве
  • Многоуровневое сопоставление - 60+ вымышленных названий Sakila сопоставлены с реальными фильмами
  • Популярные фильмы - автоматический выбор популярных фильмов по году (1997-2006)
  • Резервные постеры - красивые эмодзи при отсутствии API ключа
  • Кэширование - оптимизация запросов к TMDB API

📊 Статистика и аналитика

  • Популярные запросы - топ-5 самых частых поисков (уникальные по параметрам)
  • Последние поиски - 5 последних уникальных запросов с временем выполнения
  • MongoDB логирование - логирование только первой страницы поиска для избежания дублей
  • Базовый класс MongoConnection - единое подключение для всех MongoDB операций
  • Обработка ошибок подключения - автоматическая проверка соединения с MongoDB

🎨 Современный интерфейс

  • Адаптивный дизайн - работает на всех устройствах
  • Темная тема - профессиональный дизайн
  • AJAX навигация - без перезагрузки страницы
  • Постеры фильмов - фиксированная высота 400px для единообразия
  • Умная типографика - ограничение описаний, выравнивание контента

🛠 Технологический стек

Backend

  • FastAPI 0.104+ - современный асинхронный веб-фреймворк
  • Python 3.9+ - основной язык программирования
  • Uvicorn - ASGI сервер для production

Базы данных

  • MySQL 8.0+ - база данных Sakila с фильмами
  • MongoDB 4.6+ - логирование и статистика запросов

Frontend

  • HTML5 - семантическая разметка
  • CSS3 - Design System, CSS Variables
  • Vanilla JavaScript - без фреймворков, чистый ES6+

Внешние API

  • TMDB API - The Movie Database для постеров фильмов

Библиотеки Python

fastapi==0.104.1          # Веб-фреймворк
uvicorn==0.24.0           # ASGI сервер
pydantic==2.5.0           # Валидация данных
mysql-connector-python    # MySQL драйвер
pymongo==4.6.0            # MongoDB драйвер
requests==2.31.0          # HTTP клиент для TMDB API

🚀 Установка и запуск

Предварительные требования

  • Python 3.9 или выше
  • MySQL 8.0+ с базой данных Sakila
  • MongoDB 4.6+
  • (Опционально) TMDB API ключ для постеров

Шаг 1: Клонирование репозитория

git clone <repository-url>
cd film-search-project

Шаг 2: Создание виртуального окружения

python -m venv .venv

# Windows
.venv\Scripts\activate

# Linux/Mac
source .venv/bin/activate

Шаг 3: Установка зависимостей

pip install -r requirements.txt

Шаг 4: Настройка конфигурации

  1. Откройте local_settings.py
  2. Настройте подключения к MySQL и MongoDB
  3. (Опционально) Настройте TMDB API в tmdb_config.py

Шаг 5: Запуск приложения

python main.py

Приложение будет доступно по адресу: http://localhost:8000


📁 Структура проекта

film-search-project/
├── main.py                      # Точка входа FastAPI приложения
├── local_settings.py            # Конфигурация БД (не в Git)
├── tmdb_config.py               # Конфигурация TMDB API (не в Git)
├── requirements.txt             # Python зависимости
├── README.md                    # Этот файл
├── ARCHITECTURE.md              # Архитектура приложения
├── TMDB_SETUP.md                # Инструкция по настройке TMDB
├── .gitignore                   # Исключения для Git
│
├── app/                         # Основной пакет приложения
│   ├── database/
│   │   ├── mysql_connector.py    # DAO для MySQL
│   │   └── mongo_connection.py   # Подключение к MongoDB
│   │
│   ├── logging/
│   │   ├── log_writer.py         # Запись логов в MongoDB (наследует MongoConnection)
│   │   └── log_stats.py          # Получение статистики (наследует MongoConnection)
│   │
│   ├── models/
│   │   └── schemas.py            # Pydantic модели
│   │
│   ├── routes/
│   │   └── films.py              # API маршруты
│   │
│   └── utils/
│       └── formatter.py          # Форматирование и TMDB API
│
└── static/                   # Статические файлы
    ├── index.html            # Главная страница
    ├── css/
    │   └── styles.css        # Стили
    └── js/
        └── script.js         # JavaScript логика

🌐 API Endpoints

Поиск фильмов

GET /api/search/keyword?q={keyword}&page={page}
GET /api/search/genre-year?genre={genre}&year_from={year}&year_to={year}&page={page}
GET /api/search/actor?actor_id={id}&page={page}

Справочные данные

GET /api/genres                    # Список всех жанров
GET /api/actors                    # Список всех актёров
GET /api/year-range               # Диапазон лет в БД
GET /api/year-range-for-genre?genre={genre}  # Диапазон для жанра

Статистика

GET /api/stats/popular            # Топ-5 популярных запросов
GET /api/stats/recent             # 5 последних уникальных поисков

Служебные

GET /                             # Главная страница
GET /health                       # Проверка здоровья приложения

⚙️ Конфигурация

MySQL (local_settings.py)

dbconfig = {
    'host': 'your-mysql-host',
    'user': 'your-username',
    'password': 'your-password',
    'database': 'sakila'
}

MongoDB (local_settings.py)

MONGODB_URL_READ = 'mongodb://user:pass@host:port/?authSource=db'
MONGODB_URL_WRITE = 'mongodb://user:pass@host:port/?authSource=db'

TMDB API (tmdb_config.py)

TMDB_API_KEY = "your_api_key_here"  # Получите на themoviedb.org

📚 Документация

  • TMDB_SETUP.md - Настройка TMDB API для постеров
  • ARCHITECTURE.md - Архитектура приложения (если есть)

🎯 Ключевые особенности реализации

1. Умное сопоставление постеров

Вымышленные названия из Sakila автоматически сопоставляются с реальными фильмами:

  • ACADEMY DINOSAURJurassic Park
  • ALIEN CENTERAlien
  • 60+ готовых сопоставлений

2. Простая и эффективная статистика

Логирование только первой страницы поиска для избежания дублей:

  • Фильтрация по параметру page==1 в LogWriter
  • Чистая статистика без дублирующих записей
  • Быстрые запросы без сложных aggregation pipeline
  • Экономия места в MongoDB

3. Улучшенная архитектура MongoDB

  • Базовый класс MongoConnection - единое подключение для всех операций
  • Наследование - LogWriter и LogStats наследуют от MongoConnection
  • Обработка ошибок - проверка подключения через ping команду
  • Таймауты - настроенные таймауты для стабильного подключения

4. Автоматический диапазон лет

При выборе жанра автоматически обновляются доступные годы выпуска.

5. Адаптивные постеры

  • Фиксированная высота 400px для всех постеров
  • object-fit: cover для пропорционального обрезания
  • Fallback на эмодзи при ошибках загрузки

🔒 Безопасность

  • ✅ Параметризованные SQL запросы (защита от SQL injection)
  • ✅ Валидация входных данных через Pydantic
  • ✅ CORS настроен для безопасности
  • ✅ Секретные данные в .gitignore
  • ✅ Обработка всех исключений

📝 Соответствие PEP8

  • ✅ Отступы 4 пробела
  • ✅ Понятные имена переменных и функций
  • ✅ Docstrings для всех функций
  • ✅ Комментарии к сложной логике
  • ✅ Модульная архитектура без дублирования
  • ✅ Type hints для параметров и возвращаемых значений

🧪 Тестирование

Приложение протестировано на:

  • ✅ Поиск по всем критериям
  • ✅ Постраничная навигация
  • ✅ Обработка ошибок подключения
  • ✅ Некорректный ввод пользователя
  • ✅ Пустые результаты поиска
  • ✅ Статистика и логирование

🤝 Вклад в проект

Проект выполнен как итоговая работа по курсам Python и Database.


📄 Лицензия

MIT License - свободное использование в образовательных целях.


👨‍💻 Автор

lor2ex - Проект Film Search
Итоговая работа по модулям Python Fundamentals и Database


🙏 Благодарности

  • ibarbylev - Большое спасибо за отличный курс Python 🐍
  • Sakila Database - тестовая база данных MySQL
  • TMDB - The Movie Database API
  • FastAPI - отличный веб-фреймворк
  • WWW - вдохновение для дизайна

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors