Para construir un sistema de autenticación básico en Django que notifique al usuario sobre errores en sus credenciales, es fundamental comprender la interacción entre la configuración de rutas, el procesamiento en la vista y la renderización de la interfaz. A continuación, se detallan los componentes esenciales de este flujo:
- URLconf: Módulo de Python encargado de mapear patrones de URL (expresiones regulares o rutas fijas) hacia funciones de vista específicas.
- Vistas (Views): Funciones que procesan las peticiones web y devuelven una respuesta, que puede ser desde un archivo HTML hasta una redirección o un error específico.
- Settings: Archivo central de configuración donde se definen las aplicaciones instaladas, bases de datos y middlewares del pryoecto.
Configuración de Rutas (urls.py)
En el archivo de rutas principal, definimos el punto de entrada para el formulario de acceso utilizando re_path para manejar la expresión regular de la URL.
from django.urls import re_path
from django.contrib import admin
from my_app import views
urlpatterns = [
re_path(r'^admin/', admin.site.urls),
re_path(r'^identificarse/$', views.procesar_login),
]
Lógica de la Vista (views.py)
La función de vista debe ser capaz de diferenciar entre una petición inicial (GET) y el envío del formulario (POST). En caso de que los datos no coincidan con los criterios establecidos, se captura un mensaje que será enviado de vuelta al template.
from django.shortcuts import render, redirect
def procesar_login(request):
mensaje_error = ""
if request.method == "POST":
# Extracción de datos enviados por el usuario
nombre_usuario = request.POST.get('user_input', None)
clave_acceso = request.POST.get('password_input', None)
# Validación de prueba
if nombre_usuario == 'admin' and clave_acceso == 'pass123':
return redirect('https://www.google.com')
else:
# Asignación del mensaje en caso de fallo
mensaje_error = 'El nombre de usuario o la contraseña no son válidos'
return render(request, 'login.html', {'alerta': mensaje_error})
Ajustes de Middleware (settings.py)
Para simplificar este ejemplo y permitir el procesamiento de formularios POST sin el token de seguridad obligatorio, es necesario comentar la línea del middleware de CSRF. Nota: En entornos de producción, se recomeinda mantener esta protección activa.
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware', # Desactivado para simplificar la validación
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
Interfaz de Usuario (login.html)
El archivo HTML contiene el formulario que apunta a la ruta definida anteriormente. Se utiliza la sintaxis de plantillas de Django {{ }} para mostrar dinámicamente el mensaje de error si existe.
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Acceso al Sistema</title>
<style>
.campo-formulario {
margin-bottom: 15px;
}
label {
display: inline-block;
width: 100px;
font-weight: bold;
}
.error-texto {
color: #d9534f;
font-size: 0.9em;
}
</style>
</head>
<body>
<form action="/identificarse/" method="post">
<div class="campo-formulario">
<label for="user_input">Usuario:</label>
<input name="user_input" type="text" required>
</div>
<div class="campo-formulario">
<label for="password_input">Clave:</label>
<input name="password_input" type="password" required>
</div>
<div>
<button type="submit">Entrar</button>
<span class="error-texto">{{ alerta }}</span>
</div>
</form>
</body>
</html>