Ver índice de contenidos del libro

13.3. Cache por vista

Una forma más granular de usar el framework de cache es colocar en cache la salida de las diferentes vistas. Esto tiene el mismo efecto que la cache por sitio (incluyendo la omisión de colocar en cache los pedidos con parámetros GET y POST). Se aplica a cualquier vista que tu especifiques, en vez de aplicarse al sitio entero.

Haz esto usando un decorador, que es un wrapper de la función de la vista que altera su comportamiento para usar la cache. El decorador de cache por vista es llamado cache_page y se encuentra en el módulo django.views.decorators.cache, por ejemplo:

from django.views.decorators.cache import cache_page
 
def my_view(request, param):
    # ...
my_view = cache_page(my_view, 60 * 15)

De otra manera, si estás usando la versión 2.4 o superior de Python, puedes usar la sintaxis de un decorador. El siguiente ejemplo es equivalente al anterior:

from django.views.decorators.cache import cache_page
 
@cache_page(60 * 15)
def my_view(request, param):
    # ...

cache_page recibe un único argumento: el tiempo de vida en segundos de la cache. En el ejemplo anterior, el resultado de my_view() estará en cache unos 15 minutos. (toma nota de que lo hemos escrito como 60 * 15 para que sea entendible. 60 * 15 será evaluado como 900 — que es igual a 15 minutos multiplicados por 60 segundos cada minuto.)

La cache por vista, como la cache por sitio, es indexada independientemente de la URL. Si múltiples URLs apuntan a la misma vista, cada URL será puesta en cache separadamente. Continuando con el ejemplo de my_view, si tu URLconf se ve como:

urlpatterns = ('',
    (r'^foo/(\d{1,2})/$', my_view),
)

los pedidos a /foo/1/ y a /foo/23/ serán puestos en cache separadamente, como es de esperar. Pero una vez que una misma URL es pedida (p.e. /foo/23/), los siguientes pedidos a esa URL utilizarán la cache.

13.3.1. Especificar la cache por vista en URLconf

Los ejemplos en la sección anterior tienen configurado que la vista se coloque en cache, porque cache_page modifica la función my_view ahí mismo. Este enfoque acopla tu vista con el sistema de cache, lo cual no es lo ideal por varias razones. Por ejemplo, puede que quieras reusar las funciones de la vista en otro sitio sin cache, o puede que quieras distribuir las vistas a gente que quiera usarlas sin que sean colocadas en la cache. La solución para estos problemas es especificar la cache por vista en URLconf en vez de especificarla junto a las vistas mismas.

Hacer eso es muy fácil: simplemente envuelve la función de la vista con cache_page cuando hagas referencia a ella en URLconf. Aquí el URLconf como estaba antes:

urlpatterns = ('',
    (r'^foo/(\d{1,2})/$', my_view),
)

Ahora la misma cosa con my_view envuelto con cache_page:

from django.views.decorators.cache import cache_page
 
urlpatterns = ('',
    (r'^foo/(\d{1,2})/$', cache_page(my_view, 60 * 15)),
)

Si tomas este enfoque no olvides de importar cache_page dentro de tu URLconf.