Мигающие сообщения
Хорошие приложения и пользовательские интерфейсы основаны на обратной связи. Если пользователь не получает достаточно обратной связи, он, вероятно, возненавидит приложение. Flask предоставляет очень простой способ предоставить пользователю обратную связь с помощью системы мигающих сообщений. Система мигающих сообщений в основном позволяет записывать сообщение в конце запроса и получить доступ к нему в следующем запросе, и только в следующем запросе. Обычно это сочетается с шаблоном макета, который это делает. Обратите внимание, что браузеры, а иногда и веб-серверы, накладывают ограничение на размер файлов cookie. Это означает, что мигающие сообщения, которые слишком велики для файлов cookie сеанса, приводят к тому, что мигание сообщениями завершается без видимых ошибок.
Простое мигание
Итак, вот полный пример:
from flask import Flask, flash, redirect, render_template, \
request, url_for
app = Flask(__name__)
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'
@app.route('/')
def index():
return render_template('index.html')
@app.route('/login', methods=['GET', 'POST'])
def login():
error = None
if request.method == 'POST':
if request.form['username'] != 'admin' or \
request.form['password'] != 'secret':
error = 'Invalid credentials'
else:
flash('You were successfully logged in')
return redirect(url_for('index'))
return render_template('login.html', error=error)
И вот layout.html шаблон, который делает волшебство:
<!doctype html>
<title>My Application</title>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul class=flashes>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
{% block body %}{% endblock %}
Вот index.html шаблон, который наследуется от layout.html:
{% extends "layout.html" %}
{% block body %}
<h1>Overview</h1>
<p>Do you want to <a href="{{ url_for('login') }}">log in?</a>
{% endblock %}
И вот login.html шаблон, который также наследуется от layout.html:
{% extends "layout.html" %}
{% block body %}
<h1>Login</h1>
{% if error %}
<p class=error><strong>Error:</strong> {{ error }}
{% endif %}
<form method=post>
<dl>
<dt>Username:
<dd><input type=text name=username value="{{
request.form.username }}">
<dt>Password:
<dd><input type=password name=password>
</dl>
<p><input type=submit value=Login>
</form>
{% endblock %}
Мигание с категориями
Журнал изменений
Новая версия 0.3.
Также можно указывать категории при отображении сообщения. По умолчанию, если ничего не указано, используется категория 'message'. Можно использовать альтернативные категории, чтобы предоставить пользователю лучшую обратную связь. Например, сообщения об ошибках можно отображать с красным фоном.
Чтобы отобразить сообщение с другой категорией, просто используйте второй аргумент функции flash():
flash('Invalid password provided', 'error')
В шаблоне вам необходимо указать функции get_flashed_messages() также возвращать категории. Цикл в этом случае выглядит немного иначе:
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
<ul class=flashes>
{% for category, message in messages %}
<li class="{{ category }}">{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
Это всего лишь один пример того, как отображать эти мигающие сообщения. Также можно использовать категорию для добавления префикса, такого как <strong>Error:</strong> к сообщению.
Фильтрация мигающих сообщений
Журнал изменений
Новая версия 0.9.
Можно передать список категорий, которые фильтруют результаты функции get_flashed_messages(). Это полезно, если вы хотите отобразить каждую категорию в отдельном блоке.
{% with errors = get_flashed_messages(category_filter=["error"]) %}
{% if errors %}
<div class="alert-message block-message error">
<a class="close" href="#">×</a>
<ul>
{%- for msg in errors %}
<li>{{ msg }}</li>
{% endfor -%}
</ul>
</div>
{% endif %}
{% endwith %}
© 2007–2022 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/2.3.x/patterns/flashing/