Введение в Web-разработку на Flask: Урок 6
Проблема: Бесконечная лента
Давайте посмотрим на наш сайт. Сейчас это просто длинный список сообщений на главной странице.
А что, если кто-то напишет статью на 10 страниц? Наша главная страница станет огромной и неудобной. В реальных блогах (ВК, Дзен, YouTube) на главной мы видим только анонс, а чтобы прочитать полностью, мы кликаем на заголовок и переходим на отдельную страницу.
Сегодня мы научим наш сайт создавать такие страницы автоматически.
Цель урока
Освоить Динамические URL и научиться Удалять данные из базы.
Часть 1: Динамические Маршруты (URL)

Представьте, что в нашей базе 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)

Мы научились создавать (Create) и читать (Read). Пришло время буквы D — Delete.
Удаление записи в SQLAlchemy происходит в три этапа:
- Найти жертву:
post = Message.query.get_or_404(id) - Пометить на удаление:
db.session.delete(post)В этот момент запись еще существует в файле, но помечена “крестиком”. - Подтвердить (Commit):
db.session.commit()Запись исчезает навсегда.
Часть 5: Куда деваться после удаления?
Важный нюанс. Представьте: вы находитесь на странице статьи №5. Вы нажимаете “Удалить”. Статья исчезает. Где вы оказываетесь?
Критическая ошибка маршрутизации
Если ничего не сделать, вы останетесь на странице, которой больше нет. Это приведет к ошибке.
Поэтому после удаления мы обязательно перенаправляем пользователя на главную страницу:
return redirect("/")
Итоги и Домашнее задание
Резюме урока:
<int:id>— позволяет создавать универсальные адреса (шаблоны URL).get_or_404— ищет запись по ID и безопасно обрабатывает ошибку, если её нет.truncate— фильтр для обрезки длинного текста.db.session.delete()— удаляет запись из базы (требует commit).
ДЗ: Полноценный Блог
- Добавьте на свой сайт функционал просмотра отдельных записей.
- Сделайте так, чтобы на главной странице показывались только первые 30 символов текста.
- Добавьте кнопку “Удалить запись” (желательно красного цвета).
- Задача со звездочкой: Попробуйте сделать кнопку “Редактировать”, которая открывает форму с уже заполненным старым текстом.