Vamos a hablar sobre Middleware en Django, por qué usarlos, cómo funciona y cómo crear middleware personalizado en Django.
Cuando empecé a trabajar con Django, el concepto de middleware me sonaba abstracto. Pero pronto descubrí que es una de las herramientas más potentes para controlar lo que pasa entre la solicitud de un usuario y la respuesta del servidor. En este artículo te explico qué son los middlewares en Django, cómo funcionan y cómo crear los tuyos de forma limpia y eficiente.
En Django, el middleware es un complemento liviano que se procesa durante la ejecución de solicitudes y respuestas.
El middleware se utiliza para realizar una función en la aplicación. Las funciones pueden ser seguridad, sesión, protección CSRF, autenticación, etc.
Middlewares en Django: qué son, cómo funcionan y cómo crear uno personalizado
El termino de middleware usualmente suena abstracto en cualquier desarrollo que vamos a hacer, algo avanzado o completo, pero no es así, un Middleware es simplemente un intermediario, una función que queremos ejecutar ANTES )o después) de determinadas solicitudes del usuario, por ejemplo, para verificar que el usuario esta autenticado ANTES de ingresar a un recurso de nuestra app…
En este artículo te explico qué son los middlewares en Django, cómo funcionan y cómo crear los tuyos de forma limpia y eficiente.
1. Qué es un middleware en Django y para qué sirve
Un middleware es una pieza de código que se ejecuta entre el navegador del usuario y la vista de Django.
Su misión es interceptar la petición (request) antes de que llegue a la vista, o procesar la respuesta (response) antes de enviarla de vuelta.
Algunos ejemplos de uso:
- Seguridad: aplicar reglas de protección (CSRF, clickjacking, autenticación).
- Sesiones y usuarios: manejar cookies o datos de sesión.
- Monitoreo y rendimiento: registrar tiempos de respuesta.
- Logs o auditoría: guardar información sobre cada petición.
2. Cómo funciona el ciclo de middleware en Django
El ciclo de vida de un middleware sigue un flujo muy claro:
- Django recibe una solicitud (request).
- Cada middleware la procesa en orden, de arriba a abajo (según el orden definido en settings.py).
- Se ejecuta la vista.
- La respuesta (response) pasa de nuevo por los middlewares, esta vez en orden inverso.
Esto significa que el orden importa: si defines un middleware de autenticación después de uno que necesita un usuario autenticado, tendrás errores.
3. Tipos de middlewares en Django: integrados y personalizados
Hay dos tipos de middleware en Django:
- Middleware incorporado
- Middleware personalizado
Ya incluye varios middlewares útiles por defecto, que se definen en settings.py:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]El middleware integrado se proporciona de forma predeterminada en Django cuando crea su proyecto. Puede verificar el Middleware predeterminado en settings.py el archivo de su proyecto.
Crear tu propio middleware personalizado
Puede escribir su propio Middleware personalizado para su proyecto. El middleware personalizado puede estar basado en funciones o en clases. esto es útil cuando:
- Ejecutar una acción en todas las solicitudes (por ejemplo, loguear IPs).
- Aplicar una regla de negocio global (ejemplo: verificar si el usuario completó su perfil).
- Medir rendimiento o añadir cabeceras personalizadas.
4. Cómo crear un middleware personalizado paso a paso
Veamos cómo hacerlo en dos versiones: función y clase.
Middleware basado en funciones
def simple_middleware(get_response):
# One-time configuration and initialization.
def middleware(request):
# Code to be executed for each request before
# the view (and later middleware) are called.
response = get_response(request)
# Code to be executed for each request after
# the view are called.
return response
return middlewareMiddleware basado en clases
class CustomMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
print("custom middleware before next middleware/view")
# Code to be executed for each request before
# the view (and later middleware) are called.
response = self.get_response(request)
# Code to be executed for each request after
# the view are called.
print("custom middleware after middleware/view")
return responseUna vez que haya escrito el código de middleware, tendrá que conectarlo a su flujo de solicitud/respuesta de Django. Debe agregar la entrada a la sección MIDDLEWARE del archivo setting.py.
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# your custom middleware
'your_app.custom_middleware_file.CustomMiddleware_class',
]Recuerde agregar el middleware en una posición adecuada, ya que la evaluación del middleware depende de la posición; es decir, en Django primero va a ejecutar los que primero definas, justamente en el orden en el cual se encuentran definidos.
Cosas para recordar al usar middleware
- El orden del middleware es importante.
- Un middleware puede implementar process_request pero no puede implementar process_response y process_view
- Conclusión
- Se debe utilizar middleware personalizado cuando desee implementar cierto código para cada solicitud o respuesta, o ambas.
- Escriba middlewares personalizados en Django solo cuando tenga requisitos únicos para emplear los mismos, ya que significa una sobrecarga adicional al ciclo de solicitud-respuesta que, en ciertos momentos, puede tener un efecto negativo.
5. Buenas prácticas y errores comunes al usar middlewares en Django
- Cuida el orden.
Los primeros en la lista procesan la request antes; los últimos procesan la response antes de enviarla. - Evita hacer consultas pesadas.
Los middlewares se ejecutan en cada solicitud: no coloques lógica costosa o acceso a base de datos innecesario. - Maneja excepciones correctamente.
Usa process_exception para capturar errores y devolver respuestas personalizadas. - Prueba tu middleware.
Ejecuta tests con pytest o el test runner de Django para asegurar que no rompe el flujo.
6. Conclusión y consejos finales
Los middlewares en Django son una herramienta poderosa para controlar y enriquecer el ciclo de solicitudes y respuestas.
Te permiten centralizar lógica transversal (seguridad, auditoría, rendimiento) sin duplicar código en las vistas.
En resumen:
- Usa los middlewares integrados siempre que cubran tus necesidades.
- Crea middlewares personalizados solo cuando lo requieras.
- Mide el impacto en rendimiento antes de implementarlos en producción.
- Y, sobre todo, experimenta. Entender bien cómo viaja una solicitud en Django te da control total sobre tu aplicación.
FAQs rápidas
¿Cuál es la diferencia entre middleware basado en clase y en función?
Ambos hacen lo mismo; el de clase es más escalable y permite usar hooks adicionales.
¿Puedo tener múltiples middlewares personalizados?
Sí, y se ejecutan en orden según su posición en la lista MIDDLEWARE.
¿Qué errores comunes se cometen?
Olvidar devolver response, alterar el orden de los middlewares o ejecutar consultas costosas dentro de ellos.
Acepto recibir anuncios de interes sobre este Blog.
Conoceremos para qué son los middleware, como usarlos, cuales existen y los tipos en Django, además de algunos consejos para crear los tuyos.