Login, logout y autenticación en Django

Intermedio
Django
Django
Actualizado: 18/04/2026

authenticate() y login()

Las funciones authenticate() y login() son la base del sistema de autenticación de Django:

from django.contrib.auth import authenticate, login, logout
from django.shortcuts import render, redirect
from django.contrib import messages

def vista_login(request):
    if request.user.is_authenticated:
        return redirect('inicio')

    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')

        # authenticate() verifica credenciales y devuelve el usuario o None
        usuario = authenticate(request, username=username, password=password)

        if usuario is not None:
            if usuario.is_active:
                login(request, usuario)  # Inicia la sesión
                # Redirigir a la página solicitada originalmente o al inicio
                siguiente = request.GET.get('next', 'dashboard')
                return redirect(siguiente)
            else:
                messages.error(request, 'Tu cuenta está desactivada.')
        else:
            messages.error(request, 'Credenciales incorrectas.')

    return render(request, 'usuarios/login.html')

def vista_logout(request):
    if request.method == 'POST':  # POST para proteger contra CSRF
        logout(request)
        messages.success(request, 'Has cerrado sesión correctamente.')
    return redirect('login')

Diagrama conceptual de Login, logout y autenticación en Django

LoginView y LogoutView integradas

Django proporciona vistas de autenticación listas para usar. Solo necesitas crear las plantillas:

# urls.py del proyecto
from django.contrib.auth import views as auth_views
from django.urls import path

urlpatterns = [
    path('login/', auth_views.LoginView.as_view(
        template_name='usuarios/login.html',
        redirect_authenticated_user=True
    ), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
    path('cambiar-password/', auth_views.PasswordChangeView.as_view(
        template_name='usuarios/cambiar_password.html',
        success_url='/password-cambiado/'
    ), name='cambiar-password'),
    path('password-cambiado/', auth_views.PasswordChangeDoneView.as_view(
        template_name='usuarios/password_cambiado.html'
    ), name='password_change_done'),
]
# settings.py
LOGIN_URL = '/login/'                      # URL de redirección si no autenticado
LOGIN_REDIRECT_URL = '/dashboard/'         # URL tras login exitoso
LOGOUT_REDIRECT_URL = '/login/'           # URL tras logout

Plantilla de login

<!-- templates/usuarios/login.html -->
{% extends "base.html" %}
{% block contenido %}
<div class="login-container">
    <h2>Iniciar sesión</h2>

    {% if messages %}
        {% for message in messages %}
            <div class="alert alert-{{ message.tags }}">{{ message }}</div>
        {% endfor %}
    {% endif %}

    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="hidden" name="next" value="{{ next }}">
        <button type="submit">Acceder</button>
    </form>

    <p><a href="{% url 'registro' %}">¿No tienes cuenta? Regístrate</a></p>
    <p><a href="{% url 'password_reset' %}">¿Olvidaste tu contraseña?</a></p>
</div>
{% endblock %}

Recuperación de contraseña

Django incluye un flujo completo de recuperación de contraseña por email:

# urls.py
urlpatterns += [
    path('password-reset/', auth_views.PasswordResetView.as_view(
        template_name='usuarios/password_reset.html',
        email_template_name='usuarios/emails/password_reset.html',
        subject_template_name='usuarios/emails/password_reset_subject.txt',
    ), name='password_reset'),
    path('password-reset/done/', auth_views.PasswordResetDoneView.as_view(
        template_name='usuarios/password_reset_done.html'
    ), name='password_reset_done'),
    path('password-reset/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(
        template_name='usuarios/password_reset_confirm.html'
    ), name='password_reset_confirm'),
    path('password-reset/complete/', auth_views.PasswordResetCompleteView.as_view(
        template_name='usuarios/password_reset_complete.html'
    ), name='password_reset_complete'),
]

Para que funcione el envío de emails, configura EMAIL_BACKEND en settings.py:

# En desarrollo (imprime en consola)
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

# En producción con SMTP
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'tu_correo@gmail.com'
EMAIL_HOST_PASSWORD = 'contraseña_de_aplicacion'
DEFAULT_FROM_EMAIL = 'noreply@misitio.com'

Hashers de contraseñas

Django usa hashers para almacenar contraseñas de forma segura. La configuración por defecto usa PBKDF2 con SHA-256, que es seguro pero puede configurarse para usar Argon2 (recomendado en 2026):

# settings.py
PASSWORD_HASHERS = [
    'django.contrib.auth.hashers.Argon2PasswordHasher',  # Recomendado
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',  # Fallback
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
]
pip install argon2-cffi  # Necesario para Argon2

El primer hasher de la lista se usa para nuevas contraseñas; los demás para verificar contraseñas antiguas y actualizarlas al primer hasher al siguiente login.

Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Django es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de Django

Explora más contenido relacionado con Django y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

Usar authenticate() para verificar credenciales y login() para iniciar sesión. Implementar logout() para cerrar la sesión correctamente. Configurar las vistas integradas LoginView y LogoutView con plantillas personalizadas. Gestionar redirecciones tras el login y logout con LOGIN_REDIRECT_URL. Configurar PASSWORD_HASHERS para el almacenamiento seguro de contraseñas.