Django - Almacenamiento en caché

Almacenar algo en caché es guardar el resultado de un cálculo costoso, para que no lo realice la próxima vez que lo necesite. A continuación se muestra un pseudocódigo que explica cómo funciona el almacenamiento en caché:

given a URL, try finding that page in the cache

if the page is in the cache:
   return the cached page
else:
   generate the page
   save the generated page in the cache (for next time)
   return the generated page

Django viene con su propio sistema de almacenamiento en caché que le permite guardar sus páginas dinámicas, para evitar volver a calcularlas cuando sea necesario. El buen punto en el marco de Django Cache es que puede almacenar en caché:

  • El resultado de una vista específica.
  • Parte de una plantilla.
  • Todo tu sitio.

Para usar el caché en Django, lo primero que debe hacer es configurar dónde permanecerá el caché. El marco de caché ofrece diferentes posibilidades: el caché se puede guardar en la base de datos, en el sistema de archivos o directamente en la memoria. El ajuste se realiza en elsettings.py archivo de su proyecto.

Configuración de caché en la base de datos

Simplemente agregue lo siguiente en el archivo settings.py del proyecto:

CACHES = {
   'default': {
      'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
      'LOCATION': 'my_table_name',
   }
}

Para que esto funcione y para completar la configuración, necesitamos crear la tabla de caché 'my_table_name'. Para ello, debe hacer lo siguiente:

python manage.py createcachetable

Configuración de caché en el sistema de archivos

Simplemente agregue lo siguiente en el archivo settings.py del proyecto:

CACHES = {
   'default': {
      'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
      'LOCATION': '/var/tmp/django_cache',
   }
}

Configuración de caché en la memoria

Esta es la forma más eficiente de almacenamiento en caché; para usarla, puede usar una de las siguientes opciones dependiendo de la biblioteca de enlace de Python que elija para la memoria caché:

CACHES = {
   'default': {
      'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
      'LOCATION': '127.0.0.1:11211',
   }
}

Or

CACHES = {
   'default': {
      'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
      'LOCATION': 'unix:/tmp/memcached.sock',
   }
}

Almacenamiento en caché de todo el sitio

La forma más sencilla de usar la caché en Django es almacenar en caché todo el sitio. Esto se hace editando la opción MIDDLEWARE_CLASSES en el archivo settings.py del proyecto. Se debe agregar lo siguiente a la opción:

MIDDLEWARE_CLASSES += (
   'django.middleware.cache.UpdateCacheMiddleware',
   'django.middleware.common.CommonMiddleware',
   'django.middleware.cache.FetchFromCacheMiddleware',
)

Tenga en cuenta que el orden es importante aquí, la actualización debe venir antes que el middleware Fetch.

Luego, en el mismo archivo, debe configurar -

CACHE_MIDDLEWARE_ALIAS – The cache alias to use for storage.
CACHE_MIDDLEWARE_SECONDS – The number of seconds each page should be cached.

Almacenamiento en caché de una vista

Si no desea almacenar en caché todo el sitio, puede almacenar en caché una vista específica. Esto se hace usando elcache_pagedecorador que viene con Django. Digamos que queremos almacenar en caché el resultado de laviewArticles ver -

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)

def viewArticles(request, year, month):
   text = "Displaying articles of : %s/%s"%(year, month)
   return HttpResponse(text)

Como puedes ver cache_pagetoma la cantidad de segundos que desea que el resultado de la vista se almacene en caché como parámetro. En nuestro ejemplo anterior, el resultado se almacenará en caché durante 15 minutos.

Note - Como hemos visto antes, la vista anterior se asignó a -

urlpatterns = patterns('myapp.views',
   url(r'^articles/(?P<month>\d{2})/(?P<year>\d{4})/', 'viewArticles', name = 'articles'),)

Dado que la URL toma parámetros, cada llamada diferente se almacenará en caché por separado. Por ejemplo, la solicitud a / myapp / articles / 02/2007 se almacenará en caché por separado en / myapp / articles / 03/2008.

El almacenamiento en caché de una vista también se puede realizar directamente en el archivo url.py. Entonces lo siguiente tiene el mismo resultado que el anterior. Simplemente edite su archivo myapp / url.py y cambie la URL asignada relacionada (arriba) para que sea -

urlpatterns = patterns('myapp.views',
   url(r'^articles/(?P<month>\d{2})/(?P<year>\d{4})/', 
   cache_page(60 * 15)('viewArticles'), name = 'articles'),)

Y, por supuesto, ya no es necesario en myapp / views.py.

Almacenamiento en caché de un fragmento de plantilla

También puede almacenar en caché partes de una plantilla, esto se hace usando el cacheetiqueta. Tomemos nuestrohello.html plantilla -

{% extends "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% block content %}

Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}

the first day of month.
{% elif today == 30 %}

the last day of month.
{% else %}

I don't know.
{%endif%}

<p>
   {% for day in days_of_week %}
   {{day}}
</p>

{% endfor %}
{% endblock %}

Y para almacenar en caché el bloque de contenido, nuestra plantilla se convertirá en:

{% load cache %}
{% extends "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% cache 500 content %}
{% block content %}

Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}

the first day of month.
{% elif today == 30 %}

the last day of month.
{% else %}

I don't know.
{%endif%}

<p>
   {% for day in days_of_week %}
   {{day}}
</p>

{% endfor %}
{% endblock %}
{% endcache %}

Como puede ver arriba, la etiqueta de caché tomará 2 parámetros: el tiempo que desea que el bloque se almacene en caché (en segundos) y el nombre que se le dará al fragmento de caché.