La autenticación de usuarios es una parte fundamental de muchas aplicaciones web. Django proporciona un sistema de autenticación robusto y fácil de usar que permite gestionar usuarios, contraseñas, sesiones y permisos. En esta sección, aprenderemos cómo implementar la autenticación de usuarios en una aplicación Django.
Contenido
Configuración del Sistema de Autenticación
- Configuración Inicial
Django incluye un sistema de autenticación por defecto que está listo para usar. Asegúrate de que django.contrib.auth y django.contrib.contenttypes están incluidos en la lista de INSTALLED_APPS en tu archivo settings.py.
- Configuración de URLs
Asegúrate de que las URLs de autenticación están configuradas en tu archivo urls.py.
# urls.py
from django.urls import path, include
urlpatterns = [
...
path('accounts/', include('django.contrib.auth.urls')),
...
]Esto incluirá las vistas de login, logout, y cambio de contraseña proporcionadas por Django.
Creación de Formularios de Registro y Login
- Formulario de Registro
Primero, crearemos un formulario de registro personalizado. Para ello, crearemos un formulario en forms.py.
# forms.py
from django import forms
from django.contrib.auth.models import User
class RegisterForm(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput)
password_confirm = forms.CharField(widget=forms.PasswordInput)
class Meta:
model = User
fields = ['username', 'email', 'password']
def clean(self):
cleaned_data = super().clean()
password = cleaned_data.get("password")
password_confirm = cleaned_data.get("password_confirm")
if password != password_confirm:
raise forms.ValidationError("Las contraseñas no coinciden.")
- Vista de Registro
A continuación, crearemos una vista para manejar el registro de usuarios.
# views.py
from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from django.contrib.auth import login
from .forms import RegisterForm
def register(request):
if request.method == 'POST':
form = RegisterForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.set_password(form.cleaned_data['password'])
user.save()
login(request, user)
return redirect('home')
else:
form = RegisterForm()
return render(request, 'register.html', {'form': form})
- Plantilla de Registro
Finalmente, crearemos una plantilla para el formulario de registro.
<!-- templates/register.html -->
<!DOCTYPE html>
<html>
<head>
<title>Registro</title>
</head>
<body>
<h2>Registro</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Registrarse</button>
</form>
</body>
</html>
- Formulario de Login
Django proporciona un formulario de login por defecto. Solo necesitamos crear una plantilla para el formulario de login.
<!-- templates/registration/login.html -->
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
</head>
<body>
<h2>Login</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Login</button>
</form>
</body>
</html>Protección de Vistas con Decoradores
Para proteger las vistas y asegurarnos de que solo los usuarios autenticados puedan acceder a ellas, utilizamos el decorador login_required.
# views.py
from django.contrib.auth.decorators import login_required
@login_required
def protected_view(request):
return render(request, 'protected.html')Gestión de Sesiones y Logout
Django maneja las sesiones automáticamente. Para cerrar sesión, podemos usar la vista de logout proporcionada por Django.
- Configuración de URL para Logout
# urls.py
from django.urls import path
from django.contrib.auth import views as auth_views
urlpatterns = [
...
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
...
]
- Plantilla de Logout
<!-- templates/registration/logged_out.html -->
<!DOCTYPE html>
<html>
<head>
<title>Logout</title>
</head>
<body>
<h2>Has cerrado sesión</h2>
<a href="{% url 'login' %}">Login</a>
</body>
</html>Errores Comunes y Soluciones
Error: "Las contraseñas no coinciden"
- Solución: Asegúrate de que el método
cleanen el formulario de registro verifica que las contraseñas coinciden.
Error: "No se puede iniciar sesión"
- Solución: Verifica que el usuario y la contraseña son correctos. Asegúrate de que el usuario está activo.
Error: "Página no encontrada para /accounts/login/"
- Solución: Asegúrate de que
django.contrib.auth.urlsestá incluido en tu archivourls.py.
Conclusión
En esta sección, hemos aprendido cómo implementar la autenticación de usuarios en una aplicación Django. Hemos cubierto la configuración inicial, la creación de formularios de registro y login, la protección de vistas con decoradores, y la gestión de sesiones y logout. Con estos conocimientos, puedes asegurar que solo los usuarios autenticados puedan acceder a ciertas partes de tu aplicación.
En el siguiente módulo, exploraremos el manejo de formularios en Django, incluyendo cómo validar y procesar datos de formularios de manera eficiente.
Curso de Desarrollo Web con Django
Módulo 1: Introducción a Django
- ¿Qué es Django?
- Configuración del Entorno de Desarrollo
- Creando tu Primer Proyecto Django
- Entendiendo la Estructura del Proyecto Django
Módulo 2: Conceptos Básicos de Django
- Aplicaciones Django y Estructura del Proyecto
- Enrutamiento de URL y Vistas
- Plantillas y Archivos Estáticos
- Modelos y Bases de Datos
- Interfaz de Administración de Django
Módulo 3: Django Intermedio
- Manejo de Formularios
- Vistas Basadas en Clases
- Autenticación de Usuarios
- Middleware
- Carga de Archivos
Módulo 4: Django Avanzado
- Consultas Avanzadas con Django ORM
- Modelos de Usuario Personalizados
- Señales de Django
- Pruebas en Django
- Optimización del Rendimiento
