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')

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