Los mensajes flash (Message flashing) son una forma elegante de enviar mensajes de retroalimentación al usuario entre solicitudes en Flask. Son especialmente útiles para mostrar mensajes de éxito, error o información después de una redirección.
En esta sección, configuramos Flask para manejar mensajes flash y definimos rutas de ejemplo.
La aplicación se inicializa con app.secret_key, clave necesaria para enviar mensajes flash, y dos rutas:
success, info, warning, error) y luego redirige al inicio para mostrarlos.# Importando Flask y algunos paquete de Flask entre ellos flash
from flask import Flask, flash, render_template, redirect, url_for
# Instanciando la clase Flask
app = Flask(__name__)
# Necesario para usar mensajes flash
app.secret_key = '454ghgghfg8h9fghjnrjtr'
@app.route('/', methods=['GET'])
def inicio():
# Enviando mensajes flash de atipo success a la plantilla index.html
flash('Mensaje de prueba', 'success')
return render_template("index.html")
# Ruta para enviar mensajes flash
@app.route('/demo-flash', methods=['GET'])
def demo_flash():
flash('Mensaje de Success con Flash', 'success')
flash('Mensaje de Info con Flash', 'info')
flash('Mensaje de Warning con Flash', 'warning')
flash('Mensaje de Error con Flash', 'error')
return redirect(url_for('inicio'))
# Corriendo la app
if __name__ == '__main__':
app.run(debug=True, port=5000) Esta sección muestra los mensajes flash en la plantilla.
Se utiliza get_flashed_messages(with_categories=True) para recuperar los mensajes junto con sus categorías.
Si hay mensajes, se generan elementos de lista <li> que utilizan la categoría como clase CSS, permitiendo aplicar estilos específicos a cada tipo de mensaje.
<!-- base.html -->
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Message Flashing en Flask</title>
<!-- Opcional, para diferenciar los mensajes -->
<style>
* {
font-family: sans-serif;
margin: 0;
padding: 0;
box-sizing: border-box;
}
.success {
color: green;
}
.error {
color: red;
}
.info {
color: blue;
}
.warning {
color: orange;
}
</style>
</head>
<body>
<h2>Hola, Flask.</h2>
<!-- Mostrar mensajes flash -->
{% with messages=get_flashed_messages(with_categories=True) %}
<!-- Validando si hay mensajes flash -->
{% if messages %}
<ul>
<!-- Recorriendo los mensages, mas la categoria a la cual pertenecen -->
{% for category, message in messages %}
<!-- Usa la categoría como clase CSS para personalizar el estilo -->
<li class="{{ category }}">{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
</body>
</html> En este punto, solo falta que visites las siguientes URL para probar la aplicación:
http://127.0.0.1:5000/
http://127.0.0.1:5000/demo-flash Flash en Flask con BootstrapCuando trabajamos con Flask, los mensajes flash nos ayudan a proporcionar retroalimentación instantánea al usuario. Estos mensajes temporales aparecen solo una vez, lo que los hace perfectos para notificaciones tras redirecciones o acciones del usuario, como envíos de formularios. Usar Bootstrap para estos mensajes mejora mucho su apariencia y experiencia de usuario, ya que ofrece estilos predefinidos para diferentes tipos de mensajes (success, info, warning, danger).
# Importando Flask y algunos paquete de Flask entre ellos flash
from flask import Flask, flash, render_template, redirect, url_for
# Instanciando la clase Flask
app = Flask(__name__)
# Necesario para usar mensajes flash
app.secret_key = '454ghgghfg8h9fghjnrjtr'
@app.route('/')
def inicio():
flash('Mensaje de Success con Flash', 'success')
flash('Mensaje de Info con Flash', 'info')
flash('Mensaje de Warning con Flash', 'warning')
flash('Mensaje de Error con Flash', 'error')
flash('Hola de Danger con Flash', 'danger')
return render_template("index.html")
# Corriendo la app
if __name__ == '__main__':
app.run(debug=True, port=5000) <!-- base.html -->
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Mensajes Flash en Flask</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous" />
</head>
<body>
<div class="container mt-5">
<div class="row justify-content-center">
<div class="col-12">
<h1>Mensajes Flash en Flask</h1>
</div>
</div>
<div class="row justify-content-center">
<div class="col-12">
<!-- Mostrar mensajes flash -->
{% with messages=get_flashed_messages(with_categories=True) %}
{% if messages %}
{% for category, message in messages %}
<!-- Usamos las clases de Bootstrap para las alertas -->
<div class="alert alert-{{ category }} alert-dismissible fade show" role="alert">
{{ message }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
{% endfor %}
{% endif %}
{% endwith %}
</div>
</div>
</div>
<!-- Bootstrap JS Opcional -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-2xjAWviLddX9YMeAuUE60c3t+hckx2WgUz9o0Mi27Fr7X1s1ghcXFDx72yUIWQGs" crossorigin="anonymous"></script>
<!--
Script JS opcional para hacer desaparecer los mensajes flash despues de 3 segundos
-->
<script>
// static/js/flash.js
document.addEventListener('DOMContentLoaded', function () {
setTimeout(function () {
let alerts = document.querySelectorAll('.alert')
alerts.forEach(function (alert) {
alert.style.opacity = '0'
setTimeout(function () {
alert.remove()
}, 3000)
})
}, 3000)
})
</script>
</body>
</html> {{ category }}) para darle estilo.Este código JavaScript añade un efecto de desvanecimiento a los mensajes flash. Después de 3 segundos, disminuye la opacidad de cada alerta a 0 y las elimina del DOM tras medio segundo. Se ejecuta una vez que el contenido del documento ha cargado completamente.
// static/js/flash.js
document.addEventListener('DOMContentLoaded', function() {
setTimeout(function() {
let alerts = document.querySelectorAll('.alert');
alerts.forEach(function(alert) {
alert.style.opacity = '0';
setTimeout(function() {
alert.remove();
}, 500);
});
}, 3000);
});