Мгновенные сообщения - flash, get_flashed_messages

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

  • flash() – формирование сообщения пользователю;
  • get_flashed_messages() – обработка сформированных сообщений в шаблоне документа.

Их синтаксис, следующий:

flask.flash(message, category=’message’)

flask.get_flashed_messages(with_categories=False, category_filter=[])

  • message – текст сообщения;
  • category – категория сообщения;
  • with_categories – разрешает использование категорий при извлечении сообщений;
  • category_filter – список разрешенных категорий при выборке сообщений.

Чтобы воспользоваться функцией flash ее нужно импортировать из модуля flask:

from flask import Flask, render_template, request, flash

И, затем, в качестве примера сформируем сообщение условно при успешной проверки принятых данных и при ошибке:

if len(request.form['username']) > 2:
    flash('Сообщение отправлено')
else:
    flash('Ошибка отправки')

Далее, в шаблоне contact.html вызовем функцию get_flashed_messages следующим образом:

{% for msg in get_flashed_messages() %}
<div class="flash">{{msg}}</div>
{% endfor %}

Обратите внимание, функция get_flashed_messages возвращает итератор, содержащий сообщения, то есть, их может быть несколько, если flash в обработчике был вызван несколько раз. Но, в нашем случае, оно будет одно, которое выводится в блоке div.

Если мы сейчас попробуем отправить данные формы, то получим ошибку:

RuntimeError: The session is unavailable

Дело в том, что функции flash и get_flashed_messages используют механизм сессий, чтобы отображать сообщения только один раз и при обновлении страницы более его не показывать. Чтобы активизировать работу сессий, необходимо в конфигурацию программы прописать секретный ключ. Я сделаю это так:

app.config['SECRET_KEY'] = 'fdgdfgdfggf786hfg6hfg6h7f'

Это не самый лучший ключ, позже мы еще об этом поговорим, а пока пусть он будет записан в таком виде. Теперь, при обновлении страницы, увидим следующее:

А если обратиться к этой же странице еще раз (без отправки формы), то сообщение пропадет.

Далее, добавим оформление этому сообщению, причем разное для разных типов: успешных и ошибочных. В стилях пропишем следующее:

.flash {padding: 10px;}
.flash.success {
         border: 1px solid #21DB56;
         background: #AEFFC5;
}
.flash.error {
         border: 1px solid #FF4343;
         background: #FF9C9C;
}

А в программе вызовем функцию flash с указанием категории сообщения:

if len(request.form['username']) > 2:
    flash('Сообщение отправлено', category='success')
else:
    flash('Ошибка отправки', category='error')

Имя категории у нас и будет именем расширения стиля оформления. В шаблоне пропишем следующее:

{% for cat, msg in get_flashed_messages(True) %}
<div class="flash {{cat}}">{{msg}}</div>
{% endfor %}

Здесь параметр True в функции get_flashed_messages разрешает оперировать категориями мгновенных сообщений. Все, теперь при успешной отправке увидим сообщение на зеленом фоне, а при ошибке – на красном.

Видео по теме