Зарегистрируйтесь, чтобы продолжить обучение

Flash Python: Веб-разработка (Flask)

Во время работы на Хекслете вы могли видеть сообщение о результатах выполнения любого действия: аутентификация, регистрация или вступление в курс:

image_processing.png

В веб-разработке такое сообщение называют Flash. В этом уроке мы научимся работать с ним.

Одноразовые сообщения

Flash обычно используется после перенаправления для индикации успешности или неудачи предыдущего действия. Flash-сообщения используют механизм сессий. Он позволяет хранить информацию между разными запросами одного и того же пользователя. Этот механизм работает благодаря кукам и встроен во Flask.

Чтобы работать с Flash, сначала подключим необходимый модуль:

from flask import flash

Теперь можем использовать Flash:

from flask import Flask, flash, url_for, redirect, get_flashed_messages, render_template

app = Flask(__name__)
# устанавливаем секретный ключ для работы с сессиями
app.secret_key = "secret_key"


@app.post("/foo")
def foo_post():
    # Добавление флеш-сообщения.
    # Оно станет доступным только на следующий HTTP-запрос.
    # 'success' — тип флеш-сообщения. Используется при выводе для форматирования.
    # Например, можно ввести тип success и отображать его зеленым цветом. На Хекслете такого много.
    flash("This is a message", "success")
    return redirect("/bar")


@app.get("/bar")
def bar_index():
    # Извлечение flash-сообщений, которые установлены на предыдущем запросе
    messages = get_flashed_messages(with_categories=True)
    print(messages)  # => [('success', 'This is a message')]
    return render_template(
        "bar.html",
        messages=messages,
    )

<!-- templates/bar.html -->
{% if messages %}
  <ul class=flashes>
  {% for category, message in messages %}
    <li class="{{ category }}">{{ message }}</li>
  {% endfor %}
  </ul>
{% endif %}

Функция flash() добавляет сообщение в общее хранилище сообщений. Функция get_flashed_messages() извлекает все сообщения их этого хранилища. Дальше Flash-сообщения передаются в шаблон и там выводятся.

После извлечения хранилище обнуляется. При следующем запросе get_flashed_messages() вернет пустой массив. Другими словами — Flash-сообщения показываются только на один запрос. После обновления страницы или перехода в другое место они пропадают. Это удобно, так как не нужно следить за их жизненным циклом.

Во многих фреймворках типы Flash-сообщений стандартизированы. В основном используют следующие:

  • success — для удачно завершившихся действий
  • warning — для предупреждений
  • error — в тех ситуациях, когда произошла ошибка

Можно добавить сразу много Flash-сообщений, поэтому get_flashed_messages() возвращает следующую структуру:

flash("first message", "success")
flash("second message", "success")
flash("first message", "error")
flash("another message", "error")

get_flashed_messages()
# [
#   ('success', 'first message'),
#   ('success', 'second message'),
#   ('error', 'first message'),
#   ('error', 'another message'),
# ]

Под капотом у флеш-сообщений используются сессии, которые рассматриваются в курсе чуть позже. Благодаря этому механизму сайт запоминает конкретного пользователя и его сообщение.


Самостоятельная работа

  1. Добавьте реализацию вывода Flash-сообщений при создании пользователя, используя примеры из теории

image_processing_2.png

Эталонное приложение

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff