Django - Cache

Armazenar algo em cache é salvar o resultado de um cálculo caro, para que você não o execute na próxima vez que precisar. A seguir está um pseudocódigo que explica como funciona o 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

O Django vem com seu próprio sistema de cache que permite salvar suas páginas dinâmicas, para evitar calculá-las novamente quando necessário. O bom ponto no framework Django Cache é que você pode armazenar em cache -

  • A saída de uma visualização específica.
  • Uma parte de um modelo.
  • Seu site inteiro.

Para usar o cache no Django, a primeira coisa a fazer é configurar onde o cache ficará. A estrutura de cache oferece diferentes possibilidades - o cache pode ser salvo no banco de dados, no sistema de arquivos ou diretamente na memória. A configuração é feita nosettings.py arquivo do seu projeto.

Configurando Cache no Banco de Dados

Basta adicionar o seguinte no arquivo settings.py do projeto -

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

Para que isso funcione e para completar a configuração, precisamos criar a tabela de cache 'my_table_name'. Para isso, você precisa fazer o seguinte -

python manage.py createcachetable

Configurando Cache no Sistema de Arquivos

Basta adicionar o seguinte no arquivo settings.py do projeto -

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

Configurando Cache na Memória

Esta é a maneira mais eficiente de armazenar em cache. Para usá-la, você pode usar uma das seguintes opções, dependendo da biblioteca de vinculação Python que você escolher para o cache de memória -

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

Cache de todo o site

A maneira mais simples de usar cache no Django é armazenar em cache o site inteiro. Isso é feito editando a opção MIDDLEWARE_CLASSES no arquivo settings.py do projeto. O seguinte precisa ser adicionado à opção -

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

Observe que a ordem é importante aqui, a atualização deve vir antes do middleware Fetch.

Então, no mesmo arquivo, você precisa definir -

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

Armazenando uma Visualização em Cache

Se você não quiser armazenar em cache o site inteiro, poderá armazenar em cache uma visualização específica. Isso é feito usando ocache_pagedecorador que vem com Django. Digamos que queremos armazenar em cache o resultado doviewArticles 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 você pode ver cache_pageleva o número de segundos que você deseja que o resultado da visualização seja armazenado em cache como parâmetro. Em nosso exemplo acima, o resultado será armazenado em cache por 15 minutos.

Note - Como vimos antes, a visualização acima foi mapeada para -

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

Uma vez que o URL está recebendo parâmetros, cada chamada diferente será armazenada em cache separadamente. Por exemplo, a solicitação para / myapp / articles / 02/2007 será armazenada em cache separadamente para / myapp / articles / 03/2008.

O armazenamento em cache de uma visualização também pode ser feito diretamente no arquivo url.py. Então, o seguinte tem o mesmo resultado que o anterior. Basta editar o arquivo myapp / url.py e alterar o URL mapeado relacionado (acima) para ser -

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

E, claro, não é mais necessário em myapp / views.py.

Cache de um fragmento de modelo

Você também pode armazenar em cache partes de um modelo, isso é feito usando o cachetag. Vamos pegar nossohello.html modelo -

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

E para armazenar em cache o bloco de conteúdo, nosso modelo se tornará -

{% 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 você pode ver acima, a tag de cache terá 2 parâmetros - o tempo que você deseja que o bloco seja armazenado em cache (em segundos) e o nome a ser dado ao fragmento de cache.