API флеш-сообщений Flask
Механизм Flash используется для отображения одноразового сообщения обратной связи при следующем запросе; типичный сценарий — уведомления «операция успешна» или «ошибка ввода».
Flask сохраняет сообщения в Session и автоматически очищает их после прочтения.
Функция flash
| Параметр | Type | Значение по умолчанию | Описание |
|---|---|---|---|
| message | str | Обязательный | Текст сообщения для отображения |
| category | str | "message" | Категории сообщений, рекомендуемые значения: message, success, error, warning, info |
Функция get_flashed_messages
| Параметр | Type | Значение по умолчанию | Описание |
|---|---|---|---|
| with_categories | bool | False | Если True, возвращает список кортежей (category, message) |
| category_filter | iterable | () | Возвращать только сообщения указанной категории |
| Возвращаемое значение | Описание |
|---|---|
| with_categories=False | Возвращает список текстов сообщений: ["msg1", "msg2"] |
| with_categories=True | Возвращает список кортежей (category, message): [("success", "msg1"), ("error", "msg2")] |
Использование в шаблонах
get_flashed_messages()Их можно вызывать прямо в шаблоне, без необходимости передавать через render_template.
Пример
<!-- Отобразить все flash-сообщения -->
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
{% for category, message in messages %}
<div class="flash-{{ category }}">{{ message }}</div>
{% endfor %}
{% endif %}
{% endwith %}
<!-- Отображать только сообщения об ошибках -->
{% for msg in get_flashed_messages(category_filter=["error"]) %}
<div class="error">{{ msg }}</div>
{% endfor %}
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
{% for category, message in messages %}
<div class="flash-{{ category }}">{{ message }}</div>
{% endfor %}
{% endif %}
{% endwith %}
<!-- Отображать только сообщения об ошибках -->
{% for msg in get_flashed_messages(category_filter=["error"]) %}
<div class="error">{{ msg }}</div>
{% endfor %}
Примеры кода
Пример
from flask import Flask, flash, get_flashed_messages, redirect, url_for, request
app = Flask(__name__)
app.secret_key = "secret"
@app.route("/post", methods=["GET", "POST"])
def create_post():
if request.method == "POST":
title = request.form.get("title", "").strip()
if not title:
flash("Заголовок не может быть пустым", "error")
else:
flash(f"Статья '{title}' успешно опубликована!", "success")
return redirect(url_for("create_post"))
return redirect(url_for("create_post"))
# GET-запрос: получить и отобразить все сообщения
messages = get_flashed_messages(with_categories=True)
return render_template("post.html", messages=messages)
app = Flask(__name__)
app.secret_key = "secret"
@app.route("/post", methods=["GET", "POST"])
def create_post():
if request.method == "POST":
title = request.form.get("title", "").strip()
if not title:
flash("Заголовок не может быть пустым", "error")
else:
flash(f"Статья '{title}' успешно опубликована!", "success")
return redirect(url_for("create_post"))
return redirect(url_for("create_post"))
# GET-запрос: получить и отобразить все сообщения
messages = get_flashed_messages(with_categories=True)
return render_template("post.html", messages=messages)
Другие расширенияФлеш-сообщения хранятся в сессии, поэтому необходимо задать секретный ключSECRET_KEY. Сообщение видно только в следующем запросе после его прочтения, после чего автоматически очищается.