Django - Mise en cache

Mettre en cache quelque chose, c'est enregistrer le résultat d'un calcul coûteux, afin de ne pas l'exécuter la prochaine fois que vous en aurez besoin. Voici un pseudo code qui explique le fonctionnement de la mise en cache -

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 est livré avec son propre système de mise en cache qui vous permet de sauvegarder vos pages dynamiques, pour éviter de les recalculer en cas de besoin. Le bon point dans le framework Django Cache est que vous pouvez mettre en cache -

  • La sortie d'une vue spécifique.
  • Une partie d'un modèle.
  • Tout votre site.

Pour utiliser le cache dans Django, la première chose à faire est de configurer l'emplacement du cache. Le framework de cache offre différentes possibilités - le cache peut être enregistré dans la base de données, sur le système de fichiers ou directement en mémoire. Le réglage se fait dans lesettings.py fichier de votre projet.

Configuration du cache dans la base de données

Ajoutez simplement ce qui suit dans le fichier settings.py du projet -

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

Pour que cela fonctionne et pour terminer le paramétrage, nous devons créer la table de cache 'my_table_name'. Pour cela, vous devez faire ce qui suit -

python manage.py createcachetable

Configuration du cache dans le système de fichiers

Ajoutez simplement ce qui suit dans le fichier settings.py du projet -

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

Configuration du cache en mémoire

C'est le moyen le plus efficace de mettre en cache, pour l'utiliser, vous pouvez utiliser l'une des options suivantes en fonction de la bibliothèque de liaison Python que vous choisissez pour le cache mémoire -

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',
   }
}

Mettre en cache l'intégralité du site

Le moyen le plus simple d'utiliser le cache dans Django est de mettre en cache tout le site. Cela se fait en modifiant l'option MIDDLEWARE_CLASSES dans le fichier settings.py. Les éléments suivants doivent être ajoutés à l'option -

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

Notez que l'ordre est important ici, la mise à jour doit venir avant le middleware Fetch.

Ensuite, dans le même fichier, vous devez définir -

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

Mettre une vue en cache

Si vous ne souhaitez pas mettre en cache l'intégralité du site, vous pouvez mettre en cache une vue spécifique. Cela se fait en utilisant lecache_pagedécorateur fourni avec Django. Disons que nous voulons mettre en cache le résultat de laviewArticles voir -

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)

Comme vous pouvez le voir cache_pageprend le nombre de secondes pendant lesquelles le résultat de la vue doit être mis en cache en tant que paramètre. Dans notre exemple ci-dessus, le résultat sera mis en cache pendant 15 minutes.

Note - Comme nous l'avons vu auparavant, la vue ci-dessus était une carte pour -

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

Comme l'URL prend des paramètres, chaque appel différent sera mis en cache séparément. Par exemple, la requête à / myapp / articles / 02/2007 sera mise en cache séparément dans / myapp / articles / 03/2008.

La mise en cache d'une vue peut également être effectuée directement dans le fichier url.py. Ensuite, ce qui suit a le même résultat que ci-dessus. Modifiez simplement votre fichier myapp / url.py et modifiez l'URL associée (ci-dessus) pour qu'elle soit -

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

Et, bien sûr, ce n'est plus nécessaire dans myapp / views.py.

Mettre en cache un fragment de modèle

Vous pouvez également mettre en cache des parties d'un modèle, cela se fait en utilisant le cachemarque. Prenons notrehello.html modèle -

{% 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 %}

Et pour mettre en cache le bloc de contenu, notre modèle deviendra -

{% 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 %}

Comme vous pouvez le voir ci-dessus, la balise de cache prendra 2 paramètres - l'heure à laquelle vous voulez que le bloc soit mis en cache (en secondes) et le nom à donner au fragment de cache.