В современном 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 разрешает
оперировать категориями мгновенных сообщений. Все, теперь при успешной отправке
увидим сообщение на зеленом фоне, а при ошибке – на красном.