Cuando desarrollas aplicaciones web con Flask, puedes encontrarte con la necesidad de compartir variables o funciones en todas las plantillas, sin tener que pasarlas explícitamente desde cada vista. Ahí es donde los procesadores de contexto se vuelven útiles.
Los procesadores de contexto en Flask permiten agregar variables o funciones que estarán disponibles en todas las plantillas, de manera global, manteniendo el código más limpio y evitando repeticiones. Esto es especialmente útil para variables o datos que quieres mostrar en toda tu aplicación, como la información del usuario autenticado, configuraciones generales, o funciones de formateo.
En Flask, un procesador de contexto se define utilizando el decorador @app.context_processor.
Este decorador envuelve una función que retorna un diccionario, en el cual cada clave será el nombre de la variable disponible en las plantillas, y su valor el dato que deseas compartir.
Si necesitas mostrar información común, como el nombre del sitio o el color del tema, en todas las páginas de tu aplicación Flask, puedes usar un procesador de contexto. Esto simplifica la gestión de datos globales y evita pasar variables manualmente desde cada vista.
from flask import Flask, render_template
app = Flask(__name__)
# Definir el procesador de contexto
@app.context_processor
def inject_site_info():
return {
'site_name': 'Mi Sitio Web',
'theme_color': "#4CAF50"
}
@app.route('/')
def home():
return render_template('index.html')
# Corriendo la app
if __name__ == '__main__':
app.run(debug=True, port=5000) Uso en la Plantilla HTML:
Con el procesador de contexto definido, las variables site_name y theme_color estarán disponibles en todas las plantillas sin necesidad de pasarlas desde las vistas:
<!-- index.html -->
<title>Bienvenido a {{ site_name }}</title>
<style>
body { background-color: {{ theme_color }}; }
</style> Este procesador de contexto permite que tanto el nombre del sitio como el tema del sitio, esten disponible globalmente, manteniendo el código de cada vista más limpio y evitando la duplicación.
En una aplicación con autenticación, podrías querer que la información del usuario autenticado esté disponible en todas las plantillas, como el nombre o el rol del usuario. Puedes hacerlo con un procesador de contexto que recupere estos datos.
from flask import Flask, render_template
app = Flask(__name__)
# Simulación de cargar información del usuario en cada petición
def load_user():
return {'name': 'Urian', 'role': 'admin'}
# Procesador de contexto para inyectar el usuario directamente
@app.context_processor
def inject_user():
user = load_user() # Llama a la función directamente
return {'user': user}
@app.route('/')
def home():
return render_template('index.html')
# Corriendo la app
if __name__ == '__main__':
app.run(debug=True, port=5000) En la plantilla index.html, puedes mostrar el nombre del usuario autenticado directamente:
<!-- index.html -->
{% if user %}
<p>Bienvenido, {{ user.name }} (Rol: {{ user.role }})</p>
<!-- Salida: Bienvenido, Urian (Rol: admin ) -->
{% else %}
<p>Bienvenido, Invitado</p>
{% endif %} Proveer acceso rápido al usuario autenticado o roles en las plantillas.
@app.context_processor
def inject_user():
user = {"name": "Brenda", "is_admin": True} # Simular usuario
return {'current_user': user} Uso:
<p>Bienvenido, {{ current_user.name }}</p>
{% if current_user.is_admin %}
<a href="/admin">Panel de Administración</a>
{% endif %} Si deseas formatear fechas de una manera específica en varias plantillas, puedes definir una función en un procesador de contexto. Esto es útil para estandarizar la visualización de fechas en todo el sitio.
from flask import Flask, render_template
from datetime import datetime
app = Flask(__name__)
# Definir el procesador de contexto
@app.context_processor
def inject_format_date():
def format_date(date):
return date.strftime('%d/%m/%Y %H:%M')
return {'format_date': format_date}
@app.route('/')
def home():
current_time = datetime.now()
return render_template('index.html', current_time=current_time) En index.html, puedes usar la función format_date para formatear fechas:
<!-- index.html -->
<p>Fecha actual: {{ format_date(current_time) }}</p> Este procesador permite que cualquier fecha en el sitio pueda ser formateada de manera consistente usando la función format_date, sin tener que definir la función en cada vista.
Agregar dinámicamente el año actual en todas las plantillas.
from datetime import datetime
@app.context_processor
def inject_year():
return {'current_year': datetime.now().year} Uso:
<!-- index.html -->
<p>© {{ current_year }} Mi Empresa</p> Extiende la funcionalidad de tus plantillas Flask añadiendo utilidades personalizadas. Por ejemplo, puedes incluir funciones como capitalizar texto o calcular descuentos, facilitando su uso directo en el HTML.
Define una función en Python y regístrala como procesador de contexto:
def capitalize_text(text):
return text.capitalize()
@app.context_processor
def utility_processor():
return dict(capitalize_text=capitalize_text) Uso en la plantilla:
<p>{{ capitalize_text("bienvenido a flask") }}</p> Registrar una función para formatear cantidades en diferentes monedas.
def format_currency(value, currency="COP"):
try:
return f"{currency} ${value:,.2f}"
except ValueError:
return "Invalid value"
@app.context_processor
def utility_processor():
return dict(format_currency=format_currency) Ejemplo de uso en la plantilla::
<p>Precio: {{ format_currency(2500, "USD") }}</p> Los procesadores de contexto en Flask son una herramienta poderosa para mantener el código limpio y organizado. Permiten agregar variables y funciones globales en las plantillas sin necesidad de pasarlas explícitamente desde cada vista.