flask Лекция

Урок 6: Динамические маршруты и удаление данных

Введение в Web-разработку на Flask: Урок 6

Проблема: Бесконечная лента

Давайте посмотрим на наш сайт. Сейчас это просто длинный список сообщений на главной странице.

А что, если кто-то напишет статью на 10 страниц? Наша главная страница станет огромной и неудобной. В реальных блогах (ВК, Дзен, YouTube) на главной мы видим только анонс, а чтобы прочитать полностью, мы кликаем на заголовок и переходим на отдельную страницу.

Сегодня мы научим наш сайт создавать такие страницы автоматически.

Цель урока

Освоить Динамические URL и научиться Удалять данные из базы.


Часть 1: Динамические Маршруты (URL)

Схема работы динамической маршрутизации с параметрами в URL во Flask

Представьте, что в нашей базе 1000 статей. Мы не можем написать 1000 разных функций в Python, вроде:

  • @app.route("/post/1")
  • @app.route("/post/2")
  • … и так далее.

Нам нужна одна функция, которая умеет обрабатывать любой номер статьи. Это называется Динамический маршрут.

Аналогия: Отель

Вы работаете на ресепшене. У вас 1000 номеров. Вы же не делаете 1000 разных ключей вручную? У вас есть один универсальный программатор, в который вы просто вводите номер комнаты. Во Flask этот “номер комнаты” пишется в угловых скобках: <int:id>.


Часть 2: Синтаксис Python

Как это выглядит в коде app.py:

# <int:id> — это переменная часть адреса
# Flask поймет, что если адрес /post/5, то id = 5
@app.route("/post/<int:id>")
def show_post(id):
    # Теперь мы ищем в базе не всё подряд, а конкретную запись
    # get_or_404 — специальная команда: "Найди или выдай ошибку"
    post = Message.query.get_or_404(id)
    
    return render_template("detail.html", post=post)

Если пользователь введет адрес несуществующей статьи (например, /post/999), Flask автоматически покажет страницу 404 Not Found.


Часть 3: Ссылка “Читать далее”

Теперь нам нужно связать главную страницу и страницу статьи. В шаблоне index.html мы превращаем заголовок в ссылку.

Фильтр Truncate

Чтобы длинный текст не занимал место на главной, мы используем фильтр Jinja2: {{ msg.text | truncate(50) }} Это обрежет текст до 50 символов и добавит многоточие (“Привет, как дела…”).


Часть 4: Удаление данных (Delete)

Процесс безопасного удаления записи из базы данных SQLAlchemy

Мы научились создавать (Create) и читать (Read). Пришло время буквы DDelete.

Удаление записи в SQLAlchemy происходит в три этапа:

  1. Найти жертву: post = Message.query.get_or_404(id)
  2. Пометить на удаление: db.session.delete(post) В этот момент запись еще существует в файле, но помечена “крестиком”.
  3. Подтвердить (Commit): db.session.commit() Запись исчезает навсегда.

Часть 5: Куда деваться после удаления?

Важный нюанс. Представьте: вы находитесь на странице статьи №5. Вы нажимаете “Удалить”. Статья исчезает. Где вы оказываетесь?

Критическая ошибка маршрутизации

Если ничего не сделать, вы останетесь на странице, которой больше нет. Это приведет к ошибке. Поэтому после удаления мы обязательно перенаправляем пользователя на главную страницу: return redirect("/")


Итоги и Домашнее задание

Резюме урока:

  1. <int:id> — позволяет создавать универсальные адреса (шаблоны URL).
  2. get_or_404 — ищет запись по ID и безопасно обрабатывает ошибку, если её нет.
  3. truncate — фильтр для обрезки длинного текста.
  4. db.session.delete() — удаляет запись из базы (требует commit).

ДЗ: Полноценный Блог

  1. Добавьте на свой сайт функционал просмотра отдельных записей.
  2. Сделайте так, чтобы на главной странице показывались только первые 30 символов текста.
  3. Добавьте кнопку “Удалить запись” (желательно красного цвета).
  4. Задача со звездочкой: Попробуйте сделать кнопку “Редактировать”, которая открывает форму с уже заполненным старым текстом.

Проверь себя!

Что делает функция Message.query.get_or_404(id)?

Почему после команды db.session.delete(post) необходимо обязательно вызывать db.session.commit()?