Урок 88. Презентация проекта

📁 Блок: Финальный проект ⏱️ Время изучения: ~180 мин 🎯 Сложность: Продвинутая
#from #as #and #min #max #count #import #def #return #with #close #try #finally #list

⚡ Кратко: типичные ошибки

Избегайте самых распространённых проблем финального проекта.

  • Слишком длинные функции и один огромный файл.
  • Дублирование кода подключения и форматирования.
  • SQL-инъекции из-за конкатенации строк.
  • Неработающая или отсутствующая пагинация.
  • Отсутствие обработки ошибок — программа падает при сбое базы.
  • Слабая презентация: неподготовленная демонстрация и неуверенные ответы.

Что запомнить: проект оценивается не только кодом, но и подготовкой к защите.

🐛 Типичные ошибки при финальном проекте

1. Слишком длинные функции

Проблема: одна функция делает и меню, и SQL-запрос, и вывод, и логирование.

Решение: разбивайте на небольшие функции. Например, handle_keyword_search() только собирает ввод и вызывает search_by_keyword() и write_log().

2. Дублирование кода

Проблема: код подключения к MySQL скопирован в каждой функции поиска.

Решение: вынесите get_connection() в отдельную функцию и используйте with.

# Плохо
conn = pymysql.connect(host="...", user="...", password="...", database="...")
cursor = conn.cursor()
...

# Хорошо
with get_connection() as conn:
    with conn.cursor() as cursor:
        ...

3. SQL-инъекции

Проблема: строка запроса собирается через f-string.

# Опасно!
query = f"SELECT * FROM film WHERE title LIKE '%{keyword}%'"
cursor.execute(query)

Решение: используйте параметризованные запросы.

# Безопасно
query = "SELECT * FROM film WHERE title LIKE %s"
cursor.execute(query, (f"%{keyword}%",))

4. Неработающая пагинация

Проблема: LIMIT всегда 10, но OFFSET не меняется, поэтому «следующая страница» показывает те же фильмы.

Решение: храните номер страницы и пересчитывайте OFFSET = page * 10.

page = 0
while True:
    results = search_by_keyword(keyword, limit=10, offset=page * 10)
    print_films(results)
    if len(results) < 10:
        break
    next_page = input("Показать ещё? (y/n): ").strip().lower()
    if next_page != "y":
        break
    page += 1

5. Отсутствие обработки ошибок

Проблема: если MongoDB недоступна, приложение падает с необработанным исключением.

Решение: оборачивайте операции с базами в try ... except и выводите понятные сообщения.

try:
    write_log(...)
except pymongo.errors.ConnectionFailure:
    print("Не удалось сохранить лог: нет подключения к MongoDB.")

6. Слабая презентация

Проблема: студент показывает код, но не может объяснить, как он работает; демонстрация затягивается или проваливается из-за неподготовленных данных.

Решение:

  • Подготовьте сценарий демонстрации заранее.
  • Потренируйтесь укладываться в 5 минут.
  • Будьте готовы объяснить каждый модуль и SQL-запрос.
  • Имейте запасной план (скриншоты или записанное видео), если база данных будет недоступна.