Si eres desarrollador de Django, probablemente estés familiarizado con django.core.cache (caché del lado del servidor). Sin embargo, Django ofrece otra poderosa colección de herramientas que permite controlar eficazmente la caché HTTP, llamada django.utils.cache. Este módulo se centra en gestionar los encabezados HTTP esenciales que son cruciales para reducir la carga del servidor y mejorar la experiencia del usuario.
En esta publicación, exploraremos las principales características y el uso de django.utils.cache.
django.core.cache vs django.utils.cache
Lo primero que debemos aclarar.
-
django.core.cache(caché del lado del servidor):- Almacena resultados de consultas de bases de datos, resultados de cálculos complejos, partes de plantillas, etc., en memoria del servidor (RAM), Redis, Memcached, etc.
- Objetivo: Reduce la carga de cálculo en el servidor y acelera la generación de respuestas.
-
django.utils.cache(caché HTTP / caché del lado del cliente):- Configura encabezados de respuesta HTTP como
Cache-Control,Vary,ETag,Last-Modified. - Objetivo: Instruir al navegador o al servidor proxy para que almacene en caché la respuesta, utilizando esta respuesta en lugar de hacer una nueva solicitud al servidor cuando se realiza la misma petición.
- Configura encabezados de respuesta HTTP como
En resumen, core.cache se encarga de almacenar en caché datos, mientras que utils.cache controla cómo se almacenan en caché las respuestas HTTP.
Principales decoradores y funciones
El módulo django.utils.cache se utiliza principalmente en forma de decoradores aplicados a vistas (View).
1. @cache_control
Es el decorador más básico y potente. Permite un control detallado del encabezado HTTP Cache-Control.
max_age: Tiempo de validez de la caché (en segundos). El navegador usará la versión en caché durante este tiempo.public=True: Indica que la respuesta puede ser almacenada en caché por un caché público (por ejemplo, CDN, proxy).private=True: Indica que la respuesta solo debe ser almacenada en caché en un caché privado (como el de un navegador del usuario). (Generalmente se usa junto conmax_age)no_cache: Siempre verifica la validez con el servidor antes de usar la caché.no_store: Asegura que la respuesta no sea almacenada en caché en absoluto.
Ejemplo:
# views.py
from django.utils.cache import cache_control
# Almacena la respuesta de esta vista en la caché del navegador durante 1 hora (3600 segundos)
@cache_control(max_age=3600)
def my_public_view(request):
# ...
return response
# Esta vista contiene información sensible del usuario así que se almacena solo en caché privada (navegador) durante 30 minutos
@cache_control(private=True, max_age=1800)
def user_profile_view(request):
# ...
return response
2. @never_cache
Como su nombre indica, configura esta vista para que su respuesta no sea almacenada en caché bajo ninguna circunstancia.
Agrega el encabezado Cache-Control: max-age=0, no-cache, no-store, must-revalidate para indicar fuertemente al navegador que no debe almacenar en caché la respuesta.
Ejemplo: (generalmente usado en páginas de pago, páginas de envío de formularios importantes, etc.)
# views.py
from django.utils.cache import never_cache
@never_cache
def sensitive_form_view(request):
# ...
return response
3. @vary_on_headers / @vary_on_cookie
Se utiliza para establecer el encabezado Vary. El encabezado Vary juega un papel crucial al indicar bajo qué condiciones la respuesta en caché puede cambiar.
Por ejemplo, usar @vary_on_headers('User-Agent') permite que la caché distinga entre el contenido ofrecido a dispositivos móviles y de escritorio, dependiendo del User-Agent.
@vary_on_cookie se utiliza cuando el contenido de la vista cambia dependiendo de los valores de la cookie. (Por ejemplo, cuando el estado de inicio/cierre de sesión depende de la cookie de sesión)
Ejemplo:
# views.py
from django.views.decorators.vary import vary_on_headers, vary_on_cookie
# Almacena en caché de forma separada
# según User-Agent (móvil/escritorio) y Accept-Language (configuración del idioma)
@vary_on_headers('User-Agent', 'Accept-Language')
def content_view(request):
# ...
return response
# Vista cuyo contenido cambia dependiendo de la cookie (sesión)
@vary_on_cookie
def user_specific_view(request):
# ...
return response
Resumen
django.utils.cache es un módulo clave que ayuda a Django a adherirse bien a los estándares HTTP y a manejar la caché del lado del cliente de manera sofisticada.
Configurar adecuadamente los encabezados Cache-Control y Vary es una estrategia clave para reducir drásticamente el tráfico del servidor y hacer que los usuarios experimenten velocidades de carga más rápidas. Utilizar los decoradores de este módulo, especialmente para contenido estático o páginas de listas que cambian con poca frecuencia, puede resultar en mejoras significativas en el rendimiento.
No hay comentarios.