El middleware en Django es una capa intermedia que procesa las solicitudes (requests) y respuestas (responses) antes de que lleguen a las vistas o después de ser generadas por ellas. Los middlewares se utilizan para realizar tareas como autenticación, manejo de sesiones, filtrado de solicitudes, y más, sin necesidad de modificar directamente las vistas.
Un middleware es una clase de Python que se encarga de procesar el objeto request
antes de que llegue a la vista, o procesar el objeto response
después de que la vista lo haya generado. Cada middleware se ejecuta en una secuencia determinada y realiza una función específica, como manipular encabezados HTTP, registrar solicitudes o bloquear acceso no autorizado.
1. Request: El middleware puede interceptar y modificar la solicitud (request) antes de que llegue a la vista.
2. Response: También puede modificar la respuesta (response) después de que la vista la haya generado.
Los middlewares son procesados de forma secuencial, lo que significa que Django los ejecuta en el orden en que están listados en la configuración de la aplicación.
Los middlewares se definen en la configuración de Django dentro de la lista MIDDLEWARE
en el archivo settings.py
.
Ejemplo de configuración básica de middlewares:
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',
]
Django permite crear tus propios middlewares para realizar tareas específicas según las necesidades de tu aplicación.
Ejemplo de middleware que añade un encabezado personalizado a cada respuesta:
class MiMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# Código a ejecutar para cada solicitud antes de la vista
response = self.get_response(request)
# Código a ejecutar para cada respuesta después de la vista
response['X-Mi-Encabezado'] = 'Valor personalizado'
return response
Para activarlo, debes añadir la ruta completa de la clase a la lista MIDDLEWARE
en settings.py
:
MIDDLEWARE = [
# otros middlewares
'mi_aplicacion.middleware.MiMiddleware',
]
1. Autenticación personalizada: Validar que el usuario esté autenticado antes de acceder a ciertas rutas.
2. Registro de solicitudes: Registrar las solicitudes entrantes para monitorear tráfico o errores.
3. Control de acceso: Bloquear usuarios de ciertas IPs o países.
Django incluye varios middlewares predefinidos que cubren funcionalidades esenciales:
1. AuthenticationMiddleware: Añade el objeto user
a cada solicitud, lo que permite identificar al usuario autenticado.
2. SessionMiddleware: Maneja sesiones del usuario mediante cookies.
3. CsrfViewMiddleware: Protege contra ataques CSRF al verificar tokens en solicitudes POST.
4. SecurityMiddleware: Proporciona cabeceras adicionales para mejorar la seguridad, como Strict-Transport-Security
.
1. Autenticación basada en middleware:
Si deseas permitir solo a usuarios autenticados acceder a ciertas vistas, puedes crear un middleware personalizado que redirija a los usuarios no autenticados:
from django.shortcuts import redirect
class AutenticacionMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if not request.user.is_authenticated:
return redirect('login')
return self.get_response(request)
2. Middleware para registrar las solicitudes:
Un middleware que registra la URL de cada solicitud:
import logging
logger = logging.getLogger(__name__)
class LoggerMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
logger.info(f'Solicitud a: {request.path}')
return self.get_response(request)
Para más información sobre middlewares en Django, consulta la documentación oficial de Django.
Jorge García
Fullstack developer