El framework de sesiones
Django incluye un framework de sesiones que permite almacenar datos entre peticiones de un mismo usuario. Las sesiones se identifican con una cookie de sesión que contiene el ID de sesión (no los datos), almacenados en el backend configurado.

Almacenar y recuperar datos de sesión
# Almacenar datos en la sesión
def agregar_al_carrito(request, producto_id):
carrito = request.session.get('carrito', {})
producto_id_str = str(producto_id)
carrito[producto_id_str] = carrito.get(producto_id_str, 0) + 1
request.session['carrito'] = carrito # Asignar de nuevo para marcar como modificado
return redirect('carrito')
# Recuperar datos
def ver_carrito(request):
carrito = request.session.get('carrito', {})
return render(request, 'carrito.html', {'carrito': carrito})
# Eliminar una clave
def vaciar_carrito(request):
if 'carrito' in request.session:
del request.session['carrito']
return redirect('inicio')
# Limpiar toda la sesión (sin destruirla)
request.session.flush() # Elimina datos Y genera nuevo session_id (útil en logout)
request.session.clear() # Solo elimina los datos de sesión
# Datos de sesión del usuario autenticado
request.session.get('_auth_user_id') # ID del usuario
request.session.session_key # Clave de sesión actual
request.session.get_expiry_date() # Fecha de expiración
Configuración del SESSION_ENGINE
# settings.py
# Backend por defecto: base de datos
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
# Backend de caché (Redis o Memcached - más rápido)
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default' # Nombre del caché en CACHES
# Backend combinado caché + base de datos (resiliente)
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
# Backend de cookies firmadas (datos en el cliente, sin base de datos)
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
# Limitación: max 4096 bytes; los datos viajan en la cookie (no usar para datos sensibles)
# Backend de ficheros (no recomendado en producción)
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = '/tmp/django_sessions'
Configuración de seguridad de cookies
# settings.py
# Duración de la sesión en segundos (por defecto 2 semanas)
SESSION_COOKIE_AGE = 60 * 60 * 24 * 14 # 14 días
# La sesión expira al cerrar el navegador
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
# Cookie solo se envía por HTTPS (activar en producción)
SESSION_COOKIE_SECURE = True
# Cookie no accesible desde JavaScript
SESSION_COOKIE_HTTPONLY = True
# Política SameSite para protección CSRF
SESSION_COOKIE_SAMESITE = 'Lax' # 'Strict', 'Lax' o None
# Nombre de la cookie (cambiar para evitar colisiones en subdominios)
SESSION_COOKIE_NAME = 'mi_sesion'
# Dominio de la cookie (útil para compartir sesión entre subdominios)
SESSION_COOKIE_DOMAIN = '.ejemplo.com'
Sesiones con Redis
Para aplicaciones con múltiples instancias de servidor, Redis es el backend recomendado:
pip install django-redis
# settings.py
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
}
}
}
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'
Gestión de sesiones en el admin
El modelo Sessión se puede registrar en el panel de administración para ver y gestionar sesiones activas:
# admin.py
from django.contrib import admin
from django.contrib.sessions.models import Session
@admin.register(Session)
class SessionAdmin(admin.ModelAdmin):
list_display = ['session_key', 'expire_date']
readonly_fields = ['session_data_decoded']
def session_data_decoded(self, obj):
return obj.get_decoded()
Ejemplo: carrito de compras con sesión
class CarritoSesion:
"""Carrito de compras almacenado en la sesión."""
CLAVE_SESION = 'carrito'
def __init__(self, request):
self.session = request.session
self.carrito = self.session.get(self.CLAVE_SESION, {})
def agregar(self, producto, cantidad=1):
pk = str(producto.pk)
if pk not in self.carrito:
self.carrito[pk] = {'nombre': producto.nombre, 'precio': str(producto.precio), 'cantidad': 0}
self.carrito[pk]['cantidad'] += cantidad
self._guardar()
def eliminar(self, producto):
pk = str(producto.pk)
if pk in self.carrito:
del self.carrito[pk]
self._guardar()
def vaciar(self):
self.carrito = {}
self._guardar()
def _guardar(self):
self.session[self.CLAVE_SESION] = self.carrito
self.session.modified = True # Marcar la sesión como modificada
@property
def total(self):
return sum(
float(item['precio']) * item['cantidad']
for item in self.carrito.values()
)
def __len__(self):
return sum(item['cantidad'] for item in self.carrito.values())
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
Entender cómo funciona el framework de sesiones de Django. Almacenar y recuperar datos de sesión con request.sessión. Configurar diferentes backends de sesión (base de datos, caché, cookies firmadas). Controlar la expiración de sesiones y la seguridad de las cookies. Gestionar sesiones múltiples y eliminación de datos de sesión.