Índice de contenido
- Qué es una sesión en Django y por qué es necesaria
- Cómo Django gestiona las sesiones internamente
- Configuración básica del middleware de sesión en settings.py
- Usar request.session en una vista Django
- Ubicación de almacenamiento
- Seguridad
- Tamaño
- Casos de uso
- Cómo guardar, leer y eliminar datos en la Sesión
- 1. Guardar un valor
- 2. Consultar un valor de forma segura
- 3. Destruir un valor específico
- Limitaciones: ¿Qué podemos guardar?
- Buenas prácticas y seguridad en sesiones Django
- Preguntas frecuentes sobre sesiones en Django
- Conclusión
HTTP, que significa Protocolo de transferencia de hipertexto, es el protocolo fundamental utilizado para la comunicación en la web. Está diseñado para no tener estado, lo que significa que cada solicitud de un cliente (como un navegador web) a un servidor se procesa de forma independiente, sin memoria de interacciones anteriores. Una vez procesada una solicitud, el servidor no retiene ningún estado (o memoria) de esa solicitud.
Ahí entra en juego el sistema de sesiones de Django.
Nos quedamos sobre como manejar de archivos estáticos en Django, ahora vamos con la sesión.
Qué es una sesión en Django y por qué es necesaria
En aplicaciones típicas basadas en servidor (como las creadas con Django), se inicia una nueva sesión cuando un usuario (o más específicamente, el navegador de un usuario) interactúa por primera vez con la aplicación. Una sesión es una forma de almacenar datos para la interacción de ese usuario en particular con el servidor.
Una sesión es un mecanismo que permite asociar datos a un usuario a lo largo de múltiples solicitudes.
Cuando un usuario visita la web por primera vez, Django crea una nueva sesión y envía al navegador una cookie con un identificador único, el famoso sessionid.
Esa cookie actúa como un puente entre el cliente y el servidor: cada vez que el usuario realiza una nueva solicitud, el navegador envía el sessionid y Django puede recuperar los datos almacenados previamente.
Cuando se crea una sesión, el servidor envía un pequeño fragmento de datos llamado "cookie de sesión" al navegador del usuario. Esta cookie contiene un identificador único llamado "ID de sesión". Este ID es lo que utiliza el servidor para reconocer y diferenciar entre diferentes usuarios (o más exactamente, diferentes sesiones de navegador).
La cookie de sesión se almacena en el navegador del usuario y se envía de regreso al servidor con cada solicitud posterior, lo que permite al servidor mantener una sesión consistente en múltiples solicitudes desde el mismo navegador.
Los componentes del middleware se ejecutan en orden durante las fases de solicitud y respuesta. Cuando llega una solicitud, el middleware de sesión toma el ID de sesión de la cookie del cliente (si está presente) y recupera los datos de sesión asociados del motor de sesión configurado (base de datos, archivo, caché, etc.). Luego hace que estos datos estén disponibles como request.session durante el procesamiento de la vista.
Cómo Django gestiona las sesiones internamente
El corazón de este proceso es el SessionMiddleware, que se encarga de interceptar cada solicitud y respuesta:
- Toma el sessionid de la cookie del cliente (si existe).
- Recupera los datos asociados desde el motor de sesión configurado (base de datos, archivo, caché, etc.).
- Los hace accesibles en el objeto request.session.
- Finalmente, guarda los cambios antes de enviar la respuesta.
Ese flujo permite que Django maneje los datos del usuario sin necesidad de escribir código manual para identificarlo o conservar su estado.
Las sesiones son usadas usualmente al momento de la autenticación de usuarios; las sesiones son el “pegamento” invisible que mantiene la coherencia entre páginas, formularios y usuarios.
Configuración básica del middleware de sesión en settings.py
El middleware de sesión viene activado por defecto en la mayoría de proyectos Django, pero conviene revisarlo:
MIDDLEWARE = [
...
'django.contrib.sessions.middleware.SessionMiddleware',
...
]Después de la migración, Django crea una tabla en la base de datos para las sesiones.
En Django, cada solicitud de usuario al servidor se encapsula en un objeto de solicitud. Este objeto incluye un atributo denominado request.session. Funciona de manera similar a un diccionario de Python, lo que nos permite almacenar, recuperar y administrar datos utilizando pares clave-valor.
Para fines de demostración, creé una nueva aplicación (cookie de sesión) en el proyecto.
Usar request.session en una vista Django
Aquí, he creado una vista que esencialmente cuenta la cantidad de veces que un usuario visita la URL.
# views.py (Variante 1: Uso de render y acceso directo a la sesión)
from django.shortcuts import render
from django.views.decorators.cache import never_cache
# NOTA: En este caso, 'render' necesita un template de archivo (por ejemplo, 'visits.html')
# Asumiendo que existe un archivo 'visits.html' con el contenido: <h1>Total visits: {{ n_visits }}</h1>
@never_cache
def sessionvisit_view_variant1(request):
# 1. Obtener y actualizar el contador
current_visits = request.session.get('n_visits', 0)
new_visits = current_visits + 1
# 2. Guardar el nuevo valor en la sesión
request.session['n_visits'] = new_visits
# 3. Usar el atajo 'render' para cargar y responder.
# Aquí pasamos el *nuevo* valor para que se muestre correctamente.
return render(request, 'visits.html', {'n_visits': new_visits})Cada vez que actualizo la página, el recuento aumenta.
En la tabla django_session, puedo encontrar las claves de sesión y los datos.
También podemos mostrar los atributos de la sesión en el navegador web (usando el encabezado Set-Cookie). Así, el navegador almacena estos datos en cookies y cada vez que realiza una solicitud al servidor, esta información se transmite dentro del encabezado de la cookie.
session_data es una cadena codificada (base64). Podemos decodificarlo.
import base64
import json
session_str = "eyJuX3Zpc2l0cyI6MTR9:1rQVYV:tvm4LNPRtDXalmCcaR3cXeIMgjj3c8BqzwDca0GdK0U"
# Split the string to get the base64 portion
base64_data = session_str.split(":")[0]
# Pad the string if necessary
padded_base64_data = base64_data + '=' * (-len(base64_data) % 4)
# Decode the base64 string
decoded_data = base64.b64decode(padded_base64_data)
# Assuming the decoded data is JSON serialized
deserialized_data = json.loads(decoded_data)
print(deserialized_data)
"""
{'n_visits': 14}
"""Las sesiones y las cookies son componentes clave en la gestión de datos de estado y de usuario en aplicaciones web, pero tienen diferentes propósitos y operan de distintas maneras.
Ubicación de almacenamiento
- Cookies: Almacenadas en el lado del cliente, es decir, en el navegador web del usuario.
- Sesiones: almacenadas en el lado del servidor. El ID de sesión, que es una referencia a los datos del lado del servidor, puede almacenarse en una cookie del lado del cliente.
Seguridad
- Cookies: como se almacenan en el lado del cliente, las cookies son más vulnerables a amenazas de seguridad como manipulación y escuchas ilegales. Los datos sensibles no deben almacenarse directamente en las cookies.
- Sesiones: Generalmente más seguras ya que los datos se almacenan en el servidor. Solo se intercambia el ID de la sesión con el cliente, lo que reduce el riesgo de exposición de datos confidenciales.
Tamaño
- Cookies: de tamaño limitado (normalmente 4 KB). No apto para almacenar grandes cantidades de datos.
- Sesiones: Pueden almacenar mayores cantidades de datos ya que no están sujetas a las mismas limitaciones de tamaño que las cookies.
Casos de uso
- Cookies: ideales para almacenar pequeños fragmentos de información no confidencial, como preferencias o configuraciones del usuario.
- Sesiones: más adecuado para gestionar la autenticación de usuarios, almacenar datos específicos del usuario durante la sesión web y manejar datos confidenciales.
Cómo guardar, leer y eliminar datos en la Sesión
Utilizar la sesión es tan sencillo como manejar un diccionario o un array de Python a través del objeto request.session.
1. Guardar un valor
Para guardar información, simplemente asignamos un valor a una clave. Por ejemplo, vamos a guardar el ID de un comentario recién creado:
def add_comment(request):
# ... lógica de creación del comentario ...
request.session['comment_id'] = comment.id
return redirect('index')2. Consultar un valor de forma segura
Como las sesiones son de carácter global, puedes consultar este ID en cualquier otra vista (por ejemplo, en el index). Sin embargo, si intentas acceder a una clave que no existe, Django lanzará un error. Lo ideal es verificar si la clave está presente:
def index(request):
context = {}
if 'comment_id' in request.session:
# Convertimos a string para evitar errores al concatenar con texto
context['last_comment'] = "Último comentario ID: " + str(request.session['comment_id'])
return render(request, 'index.html', context)3. Destruir un valor específico
Siguiendo nuestro ejemplo, si queremos que el mensaje del último comentario aparezca solo una vez y luego desaparezca, hacemos lo siguiente:
def index(request):
if 'comment_id' in request.session:
print(f"Mostrando ID: {request.session['comment_id']}")
# Eliminamos la clave de la sesión
del request.session['comment_id']
return render(request, 'index.html')Limitaciones: ¿Qué podemos guardar?
Puedes guardar estructuras simples como números, strings o listas (arrays):
request.session['comments'] = [1,2,3,4,5]Sin embargo, no puedes guardar objetos complejos directamente (como una instancia de un modelo de base de datos) porque la sesión no sabe cómo serializar objetos de Django por defecto.
- Lo incorrecto: request.session['user_obj'] = User.objects.get(id=1)
- Lo correcto: Guarda simplemente la PK (ID) del objeto y luego, cuando necesites el objeto, búscalo en la base de datos usando ese ID almacenado en la sesión.
Buenas prácticas y seguridad en sesiones Django
Para proteger la integridad de las sesiones, te recomiendo:
Habilitar HTTPS y usar SESSION_COOKIE_SECURE = True.
No almacenar información sensible (contraseñas, tokens).
Usar SESSION_EXPIRE_AT_BROWSER_CLOSE si deseas que la sesión termine al cerrar el navegador.
Eliminar sesiones antiguas con el comando:
$ python manage.py clearsessions
En entornos de alto tráfico, también puede ser más eficiente usar cache-based sessions (django.contrib.sessions.backends.cache).
Preguntas frecuentes sobre sesiones en Django
- ¿Dónde se almacenan los datos de sesión?
- Por defecto, en la tabla django_session de la base de datos, aunque puedes cambiar el backend a archivos o caché.
- ¿Cómo borrar una sesión o cerrar sesión del usuario?
- Puedes usar request.session.flush() para eliminar todos los datos de la sesión actual.
- ¿Cómo inspeccionar el contenido de request.session?
- Basta con imprimirlo en consola o en una vista:
- print(request.session.items())
Conclusión
Las sesiones en Django son una herramienta potente para mantener el estado del usuario en aplicaciones web sin comprometer la seguridad.
Entender cómo se crean, almacenan y gestionan permite construir sistemas de autenticación robustos y personalizaciones duraderas.
Dominar request.session fue clave para entender el “cerebro” de Django y su manera de conectar datos entre solicitudes.
Siguiente paso, uso básico de la Shell - Consola Interactiva de Python en Django