Volver a la página principal
miércoles 16 octubre 2024
23

Cómo usar Middlewares en Django

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.

¿Qué es un Middleware en Django?

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.

Funcionamiento básico de los middlewares

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.

Cómo configurar middlewares en Django

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',
]

Crear un Middleware personalizado

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',
]

Ejemplos comunes de middlewares

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.

Middleware predefinidos en Django

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.

Algunos ejemplos

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)

Referencia oficial

Para más información sobre middlewares en Django, consulta la documentación oficial de Django.

Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer