English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Caché en Django

Para cachear resultados de cálculos costosos, no es necesario ejecutarlos nuevamente la próxima vez que los necesites. A continuación, se muestra un código pseudocódigo que explica cómo funciona la caché.

# Nombre de archivo : example.py
# Derechos de autor : 2020 Por w3codebox
# Autor por : es.oldtoolbag.com
# Fecha : 2020-08-08
dada una URL, intenta encontrar esa página en la caché
 si la página está en la caché:
    devolver la página en caché
 else:
    generar la página
    guardar la página generada en la caché (para la próxima vez)
    devolver la página generada

Django proporciona su propio sistema de caché, que le permite guardar páginas web dinámicas para evitar que se recalculen cuando se necesiten. La ventaja de la arquitectura de caché de Django es que le permite cachear -

La salida de una vista específica

Una parte del plantilla

Todo el sitio web

Para usar la caché en Django, lo primero que hay que hacer es configurar dónde se guardará la caché. El framework de caché ofrece diferentes posibilidades - La caché se puede guardar en la base de datos, en el sistema de archivos o directamente en la memoria. Puede configurarse en el archivo settings.py del proyecto.

Configurar la caché en la base de datos

Sólo hay que agregar lo siguiente al archivo settings.py del proyecto-

# Nombre de archivo : example.py
# Derechos de autor : 2020 Por w3codebox
# Autor por : es.oldtoolbag.com
# Fecha : 2020-08-08
CACHES = {
    'default': {
       'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
       'LOCATION': 'my_table_name',
    }
 }

Para este trabajo, y completar la configuración, necesitamos crear la tabla de caché 'my_table_name'. Para esto, se deben hacer lo siguiente -

# Nombre de archivo : example.py
# Derechos de autor : 2020 Por w3codebox
# Autor por : es.oldtoolbag.com
# Fecha : 2020-08-08
python manage.py createcachetable

Configurar la caché en el sistema de archivos

Sólo hay que agregar lo siguiente al archivo settings.py del proyecto-

# Nombre de archivo : example.py
# Derechos de autor : 2020 Por w3codebox
# Autor por : es.oldtoolbag.com
# Fecha : 2020-08-08
CACHES = {
    'default': {
       'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
       'LOCATION': '',/var/tmp/django_cache
    }
 }

Configurar la caché en la memoria

 -

# Nombre de archivo : example.py
# Derechos de autor : 2020 Por w3codebox
# Autor por : es.oldtoolbag.com
# Fecha : 2020-08-08
CACHES = {
    'default': {
       'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
       'LOCATION': '',127.0.0.1:11211',
    }
 }

o

# Nombre de archivo : example.py
# Derechos de autor : 2020 Por w3codebox
# Autor por : es.oldtoolbag.com
# Fecha : 2020-08-08
CACHES = {
    'default': {
       'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
       'LOCATION': 'unix:/tmp/memcached.sock',
    }
 }

Cachear todo el sitio web

El método más simple de usar la caché de alta velocidad en Django es cachear todo el sitio web. Esto se puede completar editando la opción MIDDLEWARE_CLASSES del archivo settings.py del proyecto. A continuación, se debe agregar a la opción-

# Nombre de archivo : example.py
# Derechos de autor : 2020 Por w3codebox
# Autor por : es.oldtoolbag.com
# Fecha : 2020-08-08
MIDDLEWARE_CLASSES += (
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
 )

Tenga en cuenta que el orden aquí es muy importante, la actualización debe realizarse antes de obtener el intermediario.

Luego, en el mismo archivo, también es necesario configurar -

# Nombre de archivo : example.py
# Derechos de autor : 2020 Por w3codebox
# Autor por : es.oldtoolbag.com
# Fecha : 2020-08-08
CACHE_MIDDLEWARE_ALIAS – El alias de caché a usar para el almacenamiento.
 CACHE_MIDDLEWARE_SECONDS – El número de segundos que cada página debe cachear.

Cachear vista

Si no quieres cachear todo el sitio web, puedes cachear vistas específicas. Esto se puede hacer mediante el decorador cache_page que viene con Django. Queremos cachear el resultado de la vista viewArticles-

# Nombre de archivo : example.py
# Derechos de autor : 2020 Por w3codebox
# Autor por : es.oldtoolbag.com
# Fecha : 2020-08-08
from django.views.decorators.cache import cache_page
 @cache_page(60 * 15)
 def viewArticles(request, year, month):
    text = "Mostrando artículos de: %s/%s"%(year, month)
    return HttpResponse(text)

Como puedes ver, cache_page es el número de segundos (parámetro) que deseas que se cachee el resultado de la vista. En el ejemplo anterior, el resultado se cacheará 15 minutos.

Nota - Como vimos anteriormente, la vista mencionada anteriormente se mapea a -

# Nombre de archivo : example.py
# Derechos de autor : 2020 Por w3codebox
# Autor por : es.oldtoolbag.com
# Fecha : 2020-08-08
urlpatterns = patterns('myapp.views',
    url(r'^articles/(?P<month>\d{2)/(?P<year>\d{4)/', 'viewArticles', name = 'articles'),)

Dado que el URL utiliza parámetros, cada llamada diferente se ejecutará en caché de manera separada. Por ejemplo, la solicitud /myapp/articles/02/2007 se cachearán respectivamente. /myapp/articles/03/2008.

Cachear una vista también se puede realizar directamente en el archivo url.py. A continuación, hay resultados idénticos a los mencionados anteriormente. Basta con editar myapp/url.py archivo y cambiar (los) mapas de URL relacionados (arriba). -

# Nombre de archivo : example.py
# Derechos de autor : 2020 Por w3codebox
# Autor por : es.oldtoolbag.com
# Fecha : 2020-08-08
urlpatterns = patterns('myapp.views',
    url(r'^articles/(?P<month>\d{2)/(?P<year>\d{4)/', 
    cache_page(60 * 15)('viewArticles'), name = 'articles'),)

Por supuesto, ya no necesita myapp/views.py。

Cachear fragmentos de plantilla

También se puede cachear parte del plantilla, lo que se realiza mediante la etiqueta de cache. Vamos a modificar el plantilla de hello.html. -

# Nombre de archivo : example.py
# Derechos de autor : 2020 Por w3codebox
# Autor por : es.oldtoolbag.com
# Fecha : 2020-08-08
{% extends "main_template.html" %}
 {% block title %}Mi página de hola{% endblock %}
 {% block content %}
 ¡Hola Mundo!!!<p>Hoy es {{today}}</p>
 Somos
 {% if today.day == 1 %}
 el primer día del mes.
 {% elif today == 30 %}
 el último día del mes.
 {% else %}
 No lo sé.
 {% endif %}
 <p>
    {% for day in days_of_week %}
    {{day}}
 </p>
 {% endfor %}
 {% endblock %}

El bloque de contenido en caché será -

# Nombre de archivo : example.py
# Derechos de autor : 2020 Por w3codebox
# Autor por : es.oldtoolbag.com
# Fecha : 2020-08-08
{% load cache %}
 {% extends "main_template.html" %}
 {% block title %}Mi página de hola{% endblock %}
 {% cache 500 content %}
 {% block content %}
 ¡Hola Mundo!!!<p>Hoy es {{today}}</p>
 Somos
 {% if today.day == 1 %}
 el primer día del mes.
 {% elif today == 30 %}
 el último día del mes.
 {% else %}
 No lo sé.
 {% endif %}
 <p>
    {% for day in days_of_week %}
    {{day}}
 </p>
 {% endfor %}
 {% endblock %}
 {% endcache %}

Como puedes ver arriba, las etiquetas de caché necesitarán2Un parámetro - el bloque deseado que se almacena en caché (segundos) y el nombre proporcionado para el fragmento de caché.