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

Cache Django

Para armazenar resultados de cálculos caros, que você não precisará executar novamente quando precisar delas. Abaixo está um código pseudocódigo que explica como o cache funciona -

# Nome do Arquivo : example.py
# Copyright : 2020 Por w3codebox
# Autor por : pt.oldtoolbag.com
# Data : 2020-08-08
dado um URL, tente encontrar essa página no cache
 se a página estiver no cache:
    retorne a página cacheada
 else:
    gerar a página
    salve a página gerada no cache (para a próxima vez)
    retorne a página gerada

O Django oferece seu próprio sistema de cache, permitindo que você salve páginas dinâmicas para evitar recalculá-las quando necessário. A vantagem da arquitetura de cache do Django é que permite que você cache -

Saída específica da view

Parte do template

Todo o site

Para usar cache no Django, a primeira coisa a fazer é configurar onde o cache será salvo. O framework de cache oferece várias possibilidades - O cache pode ser salvo no banco de dados, no sistema de arquivos ou diretamente na memória. Pode ser configurado no arquivo settings.py do projeto.

Configurar cache no banco de dados

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

# Nome do Arquivo : example.py
# Copyright : 2020 Por w3codebox
# Autor por : pt.oldtoolbag.com
# Data : 2020-08-08
CACHES = {
    'default': {
       'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
       'LOCATION': 'my_table_name',
    }
 }

Para essa tarefa, e completar a configuração, precisamos criar a tabela de cache 'my_table_name'. Para isso, precisamos fazer o seguinte -

# Nome do Arquivo : example.py
# Copyright : 2020 Por w3codebox
# Autor por : pt.oldtoolbag.com
# Data : 2020-08-08
python manage.py createcachetable

Configurar cache no sistema de arquivos

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

# Nome do Arquivo : example.py
# Copyright : 2020 Por w3codebox
# Autor por : pt.oldtoolbag.com
# Data : 2020-08-08
CACHES = {
    'default': {
       'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
       'LOCATION': '/var/tmp/django_cache',
    }
 }

Configurar cache na memória

Esta é a maneira mais eficaz de usar cache, você pode usá-la dependendo da biblioteca de ligação Python que escolheu o cache de memória, conforme uma das opções a seguir -

# Nome do Arquivo : example.py
# Copyright : 2020 Por w3codebox
# Autor por : pt.oldtoolbag.com
# Data : 2020-08-08
CACHES = {
    'default': {
       'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
       'LOCATION': '127.0.0.1:11211',
    }
 }

ou

# Nome do Arquivo : example.py
# Copyright : 2020 Por w3codebox
# Autor por : pt.oldtoolbag.com
# Data : 2020-08-08
CACHES = {
    'default': {
       'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
       'LOCATION': 'unix:/tmp/memcached.sock',
    }
 }

Cachear todo o site

A maneira mais simples de usar cache rápido no Django é cachear todo o site. Isso pode ser feito editando a opção MIDDLEWARE_CLASSES no arquivo settings.py do projeto. Abaixo estão os itens que precisam ser adicionados à opção-

# Nome do Arquivo : example.py
# Copyright : 2020 Por w3codebox
# Autor por : pt.oldtoolbag.com
# Data : 2020-08-08
MIDDLEWARE_CLASSES += (
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
 )

Por favor, note que a ordem é muito importante, as atualizações devem ser feitas antes de obter o middleware.

Em seguida, ainda no mesmo arquivo, ainda é necessário configurar -

# Nome do Arquivo : example.py
# Copyright : 2020 Por w3codebox
# Autor por : pt.oldtoolbag.com
# Data : 2020-08-08
CACHE_MIDDLEWARE_ALIAS – O alias de cache a ser usado para o armazenamento.
 CACHE_MIDDLEWARE_SECONDS – O número de segundos que cada página deve ser armazenada em cache.

Armazenamento de view

Se você não quiser armazenar todo o site em cache, pode armazenar views específicas. Isso pode ser feito usando o decorador cache_page do Django. Vamos armazenar o resultado da view viewArticles-

# Nome do Arquivo : example.py
# Copyright : 2020 Por w3codebox
# Autor por : pt.oldtoolbag.com
# Data : 2020-08-08
from django.views.decorators.cache import cache_page
 @cache_page(60 * 15)
 def viewArticles(request, year, month):
    text = "Exibindo artigos de: %s/%s"%(year, month)
    return HttpResponse(text)

Como você vê, cache_page é o número de segundos (parâmetro) que você deseja que o resultado da view seja armazenado em cache. No exemplo acima, o resultado será armazenado em cache 15 minutos.

Notas - Como vimos anteriormente, essas views são mapeadas para -

# Nome do Arquivo : example.py
# Copyright : 2020 Por w3codebox
# Autor por : pt.oldtoolbag.com
# Data : 2020-08-08
urlpatterns = patterns('myapp.views',
    url(r'^articles/(?P<month>\d{2)/(?P<year>\d{4)/', 'viewArticles', name = 'articles'),)

Devido ao uso de parâmetros na URL, cada chamada diferente será executada em cache separadamente. Por exemplo, a solicitação /myapp/articles/02/2007 serão armazenados em cache separadamente. /myapp/articles/03/2008.

Armazenar uma view pode ser feito diretamente no arquivo url.py. Em seguida, há resultados idênticos aos mencionados acima. Basta editar myapp/arquivo url.py e alterar (os) mapeamentos de URL relevantes (acima) -

# Nome do Arquivo : example.py
# Copyright : 2020 Por w3codebox
# Autor por : pt.oldtoolbag.com
# Data : 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'),)

Claro, ele não precisa mais de myapp/views.py。

Fragmento de armazenamento de modelo

Também pode armazenar parte do modelo, o que é feito usando a etiqueta cache. Vamos modificar o modelo hello.html -

# Nome do Arquivo : example.py
# Copyright : 2020 Por w3codebox
# Autor por : pt.oldtoolbag.com
# Data : 2020-08-08
{% extends "main_template.html" %}
 {% block title %}Minha Página de Olá{% endblock %}
 {% block content %}
 Hello World!!!<p>Hoje é {{today}}</p>
 Nós somos
 {% if today.day == 1 %}
 o primeiro dia do mês.
 {% elif today == 30 %}
 o último dia do mês.
 {% else %}
 Eu não sei.
 {% endif %}
 <p>
    {% for day in days_of_week %}
    {{day}}
 </p>
 {% endfor %}
 {% endblock %}

O template do bloco de conteúdo de cache será -

# Nome do Arquivo : example.py
# Copyright : 2020 Por w3codebox
# Autor por : pt.oldtoolbag.com
# Data : 2020-08-08
{% load cache %}
 {% extends "main_template.html" %}
 {% block title %}Minha Página de Olá{% endblock %}
 {% cache 500 content %}
 {% block content %}
 Hello World!!!<p>Hoje é {{today}}</p>
 Nós somos
 {% if today.day == 1 %}
 o primeiro dia do mês.
 {% elif today == 30 %}
 o último dia do mês.
 {% else %}
 Eu não sei.
 {% endif %}
 <p>
    {% for day in days_of_week %}
    {{day}}
 </p>
 {% endfor %}
 {% endblock %}
 {% endcache %}

Como você pode ver acima, as etiquetas de cache precisarão2Um parâmetro - o bloco desejado armazenado no cache (segundos) e o nome fornecido para o fragmento de cache.