Procesadores de Contexto en Flask

  Procesadores de Contexto

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.

  Procesadores de Contexto en Flask

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.

¿Por qué usar Procesadores de Contexto?

  • Permiten reutilizar lógica sin repetir código.
  • Son útiles para datos globales o funciones compartidas.
  • Facilitan el mantenimiento y flexibilidad de las plantillas.

¿Cómo funcionan los Procesadores de Contexto?

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.

Variable Global para Información del Sitio


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.

Código de Ejemplo: Definir un Procesador de Contexto

python
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:

bash
<!-- 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.

Mostrar Información del Usuario Autenticado

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.

python
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:

bash
<!-- index.html -->
{% if user %}
  <p>Bienvenido, {{ user.name }} (Rol: {{ user.role }})</p>
  <!-- Salida: Bienvenido, Urian (Rol: admin )  -->
{% else %}
  <p>Bienvenido, Invitado</p>
{% endif %}

Autenticación y Permisos


Proveer acceso rápido al usuario autenticado o roles en las plantillas.

python
@app.context_processor
def inject_user():
  user = {"name": "Brenda", "is_admin": True}  # Simular usuario
  return {'current_user': user}

Uso:

bash
<p>Bienvenido, {{ current_user.name }}</p>
{% if current_user.is_admin %}
  <a href="/admin">Panel de Administración</a>
{% endif %}

Función para Formatear Fechas


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.

python
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:

bash
<!-- 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.

Mostrar el Año Actual


Agregar dinámicamente el año actual en todas las plantillas.

python
from datetime import datetime

@app.context_processor
def inject_year():
  return {'current_year': datetime.now().year}

Uso:

bash
<!-- index.html -->
<p>&copy; {{ current_year }} Mi Empresa</p>

Funciones Personalizadas en Plantillas Flask


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:

python
def capitalize_text(text):
  return text.capitalize()

@app.context_processor
def utility_processor():
  return dict(capitalize_text=capitalize_text)

Uso en la plantilla:

bash
<p>{{ capitalize_text("bienvenido a flask") }}</p>

Formatear Monedas


Registrar una función para formatear cantidades en diferentes monedas.

python
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::

bash
<p>Precio: {{ format_currency(2500, "USD") }}</p>
  Conclusión

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.