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

  1. 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.

# settings.py
INSTALLED_APPS = [
    ...
    'django.contrib.auth',
    'django.contrib.contenttypes',
    ...
]

  1. 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

  1. 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.")

  1. 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})

  1. 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>

  1. 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.

  1. 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'),
    ...
]

  1. 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 clean en 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.urls está incluido en tu archivo urls.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.

© Copyright 2024. Todos los derechos reservados