Введение в Web-разработку на Flask: Урок 7
Проблема: Право на ошибку
Представьте ситуацию: вы написали длинный пост в свой блог, нажали “Отправить” и вдруг увидели ужасную опечатку в заголовке. Что делать сейчас?
- Удалить пост и писать всё заново? (Долго и обидно).
- Оставить как есть? (Некрасиво).
Нам нужна кнопка “Редактировать”.

Сегодня мы завершаем изучение системы CRUD. Мы уже умеем:
- Create (Создавать)
- Read (Читать)
- Delete (Удалять)
Осталось самое интересное — Update (Обновлять).
Цель урока
Научиться изменять существующие данные и отправлять пользователю мгновенные уведомления (Flash).
Часть 1: Логика обновления (Update)
Редактирование — это гибридная операция. Она объединяет в себе то, что мы уже знаем.
Алгоритм действий:
- Найти (GET): Сначала мы находим запись по ID (как при просмотре статьи).
- Показать (GET): Мы открываем форму, но она не пустая! В ней уже вписан старый текст.
- Изменить (POST): Пользователь меняет текст и нажимает “Сохранить”.
- Записать (POST): Мы обновляем поля в базе данных.
Часть 2: Нюанс SQLAlchemy (Слежка)
В коде Python обновление выглядит немного иначе, чем создание.
@app.route("/edit/<int:id>", methods=["POST"])
def edit_post(id):
post = Message.query.get_or_404(id) # 1. Достали объект
# 2. Меняем значения свойств
post.title = request.form['title']
post.text = request.form['text']
# 3. Сохраняем
db.session.commit()
Важное отличие от создания (Create)
Обратите внимание: Мы НЕ используем db.session.add(post).
Почему? Потому что когда мы достали post из базы, SQLAlchemy взяла его “на карандаш”. Она следит за ним.
Как только мы меняем post.title, библиотека это видит. Нам нужно только подтвердить изменения командой commit().
Часть 3: Предзаполненные формы (HTML)
Как показать пользователю старый текст в форме? Для этого в HTML используются разные подходы в зависимости от типа поля.
Часть 4: Flash-сообщения (Обратная связь)

Пользователь нажал “Сохранить”. Страница перезагрузилась. Как он поймет, что всё прошло успешно? Сайт должен “поговорить” с ним. “Запись успешно обновлена!” или “Ошибка доступа!”.
Во Flask для этого есть механизм Flash Messages. Это сообщения-однодневки. Они показываются один раз и тут же удаляются.
В Python:
from flask import flash
# ... внутри функции ...
flash("Готово! Статья обновлена.", "success")
Часть 5: Секретный ключ (Secret Key)
Требование безопасности
Flash-сообщения хранятся в Cookies браузера. Чтобы злоумышленники не могли подделать сообщения, Flask требует их “подписывать”.
Для работы Flash (и сессий вообще) вы обязаны добавить в app.py одну строчку конфигурации:
app.secret_key = "любой_набор_букв_и_цифр"
Без этого ключа при попытке использовать flash() программа выдаст ошибку.
Часть 6: Вывод сообщений в шаблоне
Чтобы сообщения появились на экране, нужно добавить специальный блок кода в base.html. Обычно его ставят над основным контентом.
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul class="flashes">
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
Теперь, что бы мы ни сделали (удалили, создали, обновили), пользователь увидит подтверждение своего действия.
Итоги и Домашнее задание
Резюме урока:
- Update: Изменение полей объекта + commit.
add()не нужен. - Value: Атрибут для вставки старых данных в input.
- Flash: Система мгновенных уведомлений.
- Secret Key: Обязательная настройка безопасности.
ДЗ: Полировка
- Реализуйте кнопку “Редактировать” для своих записей.
- Добавьте Flash-сообщения на все действия:
- Создал пост -> “Запись добавлена!” (Зеленое)
- Удалил пост -> “Запись удалена!” (Желтое/Красное)
- Обновил пост -> “Изменения сохранены!” (Зеленое)
- Сделайте так, чтобы уведомления красиво оформлялись через CSS.