Mensajes flash en Flask: cómo mostrar alertas temporales paso a paso
Índice de contenido
- ¿Qué son los mensajes flash en Flask y para qué sirven?
- Cómo usar la función flash() en Flask
- Mostrar los mensajes en los templates con get_flashed_messages()
- Categorías de mensajes flash en Flask
- Ejemplo completo: CRUD con mensajes flash
- Personalizar la apariencia de los mensajes flash
- Errores comunes y cómo solucionarlos
- Preguntas frecuentes sobre mensajes flash en Flask
- Conclusión
Mostrar mensajes de confirmación según la operación realizada, es una tarea regular; en muchos otras tecnologías incluyendo Flash, existen los mensajes flash, que son aquellos que solamente duran una petición on request, por lo tanto, son ideales para indicar si el registro se crea, actualiza o elimina correctamente o simplemente un error de sistema u otro mensaje.
Los mensajes flash en Flask son una herramienta muy útil para mostrar alertas temporales, ya sea para confirmar una operación o informar de un error. En mi experiencia, este patrón es clave para mejorar la interacción del usuario sin complicar el código: un mensaje se muestra una sola vez y desaparece al recargar o cambiar de página.
¿Qué son los mensajes flash en Flask y para qué sirven?
En Flask, un mensaje flash es una notificación que se guarda temporalmente en la sesión del usuario y se muestra en la siguiente vista renderizada. Después de mostrarse, desaparece automáticamente.
Son ideales para operaciones como:
- Crear, actualizar o eliminar registros.
- Mostrar mensajes de éxito, advertencia o error.
- Informar de validaciones de formularios.
Para esto, tenemos la función llamada flash() que recibe como argumento, el mensaje correspondiente:
my_app\tasks\controllers.py
from flask import flash
***
@taskRoute.route('/update/<int:id>', methods=['GET','POST'])
def update(id:int):
***
if form.validate_on_submit():
operations.update(form.name.data, form.category.data)
flash('The registry has been updated successfully')
return render_template('dashboard/task/update.html', form=form, formTag=formTag, formTagDelete=forms.TaskTagRemove() ,task=task, id=id)Ahora, ya con nuestra app en Flask con JinJa2 para mostrar el mensaje, lo hacemos desde los templates mediante la función get_flashed_messages() que devuelve un listado de los mensajes establecidos (podemos establecer más de un mensaje por petición) y los iteramos:
my_app\templates\dashboard\master.html
***
<body>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul class=flashes>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
***Al poder emplear los mensajes tipo flash en cualquier situación y no solo en las operaciones CRUDs anteriores, resulta buena idea colocarlo en el template, para que una vez establecidos desde el controlador, puedan ser mostrados sin importar el controlador que los defina.
Cómo usar la función flash() en Flask
La función flash() recibe como primer argumento el mensaje a mostrar. Flask lo almacena en la sesión y lo mantiene disponible hasta que se renderice la siguiente plantilla. También puedes añadir un segundo parámetro para categorizar el mensaje (por ejemplo, "info", "error", "success").
flash('El registro se ha actualizado correctamente', 'info')Esto resulta muy útil cuando quieres aplicar distintos estilos visuales según el tipo de mensaje. En mi caso, definir categorías me ha permitido mostrar alertas azules para información y rojas para errores.
Mostrar los mensajes en los templates con get_flashed_messages()
Para mostrar los mensajes flash, Flask nos ofrece la función get_flashed_messages(), que devuelve una lista de todos los mensajes almacenados en la sesión.
En mi proyecto suelo colocarlo en el template base (master.html) para que los mensajes aparezcan automáticamente en todas las vistas:
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul class="flashes">
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}Así evito repetir el bloque en cada plantilla, y cualquier controlador que use flash() mostrará su mensaje automáticamente. Es una de las prácticas que más simplifica el mantenimiento del código.
Categorías de mensajes flash en Flask
También es posible definir categorías en los mensajes, esto es útil si dependiendo el tipo de mensaje quieres colocar un diseño diferente, por ejemplo, si el mensaje es informativo, colocamos un contenedor azul:
O si es un error, un color rojo:
Entre otras posibles adaptaciones; para ello, definimos un segundo parámetro a la función de flash() que corresponde a la categoría:
flash('The registry has been updated successfully', 'info')
flash('Operación completada con éxito', 'success')
flash('Error al actualizar el registro', 'error')Y desde el template, podemos filtrar por la categoría:
{% with infos = get_flashed_messages(category_filter=["info"]) %}
{% if errors %}
{%- for msg in infos %}
***O podemos indicar que al momento de obtener el listado de mensajes flash, devuelva la categoría en una tupla:
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
{% for message in messages %}
***Y tendremos la categoría como parte del mensaje:
('info', 'The registry has been updated successfully')En mi caso, suelo asociar cada categoría con un color distinto mediante clases CSS o alertas de Bootstrap, Tailwind, o similares.
Categoría Color sugerido Uso típico
success Verde Operación exitosa
info Azul Información general
warning Amarillo Advertencias
error Rojo Errores o fallos
Ejemplo completo: CRUD con mensajes flash
Supongamos que tienes una aplicación Flask que gestiona tareas. Puedes usar mensajes flash para todas las operaciones CRUD:
@taskRoute.route('/create', methods=['POST'])
def create():
if form.validate_on_submit():
operations.create(form.data)
flash('Tarea creada correctamente', 'success')
return redirect(url_for('dashboard'))
flash('Error al crear la tarea', 'error')
return render_template('task/create.html', form=form)De esta forma, al redirigir a la vista del dashboard, Flask mantiene el mensaje en la sesión y lo muestra una sola vez.
Personalizar la apariencia de los mensajes flash
Puedes integrar los mensajes con frameworks como Bootstrap o Tailwind para mejorar su apariencia.
Por ejemplo, con Bootstrap 5:
{% for category, message in get_flashed_messages(with_categories=true) %}
<div class="alert alert-{{ category }} alert-dismissible fade show" role="alert">
{{ message }}
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
{% endfor %}Yo suelo usar este formato porque se ve bien, es accesible y desaparece fácilmente sin necesidad de JavaScript adicional.
Errores comunes y cómo solucionarlos
- El mensaje flash no se muestra.
→ Asegúrate de incluir get_flashed_messages() en el template renderizado después del flash(). - El mensaje desaparece tras un redirect.
→ Flask elimina los mensajes una vez mostrados. Si rediriges antes de renderizar, asegúrate de usar redirect() y url_for() correctamente. - Se muestran mensajes duplicados.
→ Revisa que get_flashed_messages() solo se invoque una vez por carga.
Preguntas frecuentes sobre mensajes flash en Flask
¿Puedo mostrar varios mensajes en la misma vista?
Sí. Flask permite lanzar múltiples flash() por petición, y get_flashed_messages() los devuelve todos en una lista.
¿Cómo filtrar mensajes por categoría?
Puedes usar category_filter:
{% with infos = get_flashed_messages(category_filter=["info"]) %}¿Se pueden traducir o internacionalizar los mensajes flash?
Totalmente. Si usas Flask-Babel, puedes envolver los textos en _('mensaje') y se traducirán automáticamente.
Conclusión
Los mensajes flash en Flask son una forma sencilla y poderosa de comunicar el estado de una acción al usuario. Desde que empecé a usarlos en mis proyectos, mi flujo de alertas es más limpio, coherente y fácil de mantener.
Si los combinas con categorías y estilos visuales, podrás ofrecer una experiencia más clara y profesional en tus aplicaciones Flask.
Siguiente paso, conocer como emplear un familiar de los mensajes flash, como lo es, la session en Flask.
Acepto recibir anuncios de interes sobre este Blog.
En Flash, existen los mensajes flash, que son aquellos que solamente duran una petición on request, vamos a conocer como emplearlos.