Señales en Flask: Guía Completa con Ejemplos

Las señales en Flask son eventos especiales a los que puedes “suscribirte” para que se ejecuten funciones específicas cuando ocurra un evento determinado. Flask incluye una serie de señales útiles para diferentes momentos del ciclo de vida de la solicitud:

request_started:

Señal que se dispara cuando una solicitud está a punto de ser procesada por Flask. Permite ejecutar lógica justo al comienzo del proceso de solicitud.

python
from flask import request_started

def on_request_started(sender, **extra):
  print("¡La solicitud ha comenzado!")

request_started.connect(on_request_started, app)

request_finished:

Señal que se emite cuando Flask ha terminado de procesar la solicitud, pero antes de cerrar la conexión. Ideal para tareas de cierre o limpieza.

python
from flask import request_finished

def on_request_finished(sender, response, **extra):
  print("La solicitud ha terminado.")

request_finished.connect(on_request_finished, app)

got_request_exception:

Señal que se dispara cuando ocurre una excepción no manejada durante el procesamiento de la solicitud. Esto es útil para registrar errores o notificar sobre excepciones.

python
from flask import got_request_exception

def on_exception(sender, exception, **extra):
  print("Ocurrió una excepción:", exception)

got_request_exception.connect(on_exception, app)

request_tearing_down:

Señal que se emite justo antes de que Flask cierre el contexto de la solicitud. Es útil para realizar tareas de limpieza final, como cerrar conexiones a bases de datos.

python
from flask import request_tearing_down

def on_teardown(sender, **extra):
  print("Cerrando la solicitud...")

request_tearing_down.connect(on_teardown, app)

Ejemplo Completo Integrado

python
from flask import Flask, request_started, request_finished, got_request_exception, request_tearing_down
from datetime import datetime

app = Flask(__name__)

# Registro del inicio de la solicitud
@request_started.connect_via(app)
def on_request_started(sender, **extra):
  print(f"[{datetime.now()}] Iniciando nueva solicitud")

# Registro de la finalización de la solicitud
@request_finished.connect_via(app)
def on_request_finished(sender, response, **extra):
  print(f"[{datetime.now()}] Solicitud completada - Status: {response.status_code}")

# Manejo de excepciones
@got_request_exception.connect_via(app)
def on_request_exception(sender, exception, **extra):
  print(f"[{datetime.now()}] Error: {str(exception)}")

# Limpieza final
@request_tearing_down.connect_via(app)
def on_request_tearing_down(sender, **extra):
  print(f"[{datetime.now()}] Limpiando recursos")

@app.route('/')
def hello():
  return "¡Hola Mundo!"


# Corriendo la app 
if __name__ == '__main__':
  app.run(debug=True, port=5000)
  Conclusión

Las señales en Flask son como “notificaciones” que nos permiten ejecutar código cuando ocurren ciertos eventos en nuestra aplicación. Es similar a un sistema de eventos donde podemos “escuchar” y reaccionar a diferentes situaciones.