En Django el Middleware es muy importante, se ejecuta siempre que hay una conexión en cualquier sentido, cliente a servidor o servidor a cliente, y nos puede ser muy util para resolver diferentes situaciones.
Podemos ojear la documentación oficial de Django Docs: Middleware si queremos hacernos una idea mas profunda sobre como funciona.
En este ejemplo haremos un middleware que filtre las IP's que pueden tener acceso a nuestro servidor.
Para crear nuestro middleware personalizado tenemos que: crear una carpeta con el nombre "middleware" a la altura de la carpeta de templates, el urls.py etc... (Ruta: miproyecto/miproyecto/middleware)
Para que Django reconozca nuestra carpeta middleware debemos recordar de introducir un archivo __init__.py en blanco en la carpeta recién creada 'middleware'
Hasta aquí solo hemos creado e inicializado la carpeta de middleware, ahora nos toca crear nuestro middleware personalizado, crearemos un archivo dentro de la carpeta middleware con el nombre filter_ip_middleware.py, y dentro del archivo pondremos el código.
filter_ip_middleware.py
class FilterIPMiddleware(object):
# Check if client IP is allowed
def process_request(self, request):
allowed_ips = ['192.168.1.1', '123.123.123.123',] # Lista de IP's autorizadas
ip = request.META.get('REMOTE_ADDR') # Get client IP
if ip not in allowed_ips:
raise Http403 # Aquí generamos un error de "forbidden site"
# Si la IP está dentro de las aceptadas, no hacemos nada
return None
El último paso sería buscar en el settings.py la línea MIDDLEWARE_CLASSES y añadimos al final de todo la llamada a nuestro middleware, tendría que quedar algo así:
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
# Los middleware de arriba son los que ya vendrían en el settings
# A continuación escribimos nuestro middleware
'myproject.middleware.filter_ip_middleware.FilterIPMiddleware'
)
'myproject.middleware.filter_ip_middleware.FilterIPMiddleware':
- 'myproject': Esto sería el nombre de nuestro proyecto
- 'middleware': Esto hace alusión a la carpeta donde está incluido nuestro middleware
- 'filter_ip_middleware': Esto se refiere al nombre del archivo que contiene el codigo de nuestro middleware
- 'FilterIPMiddleware': Corresponde al nombre de la clase de nuestro middleware
Cualquier duda no dudeis en comentar !!