Django - Кеширование

Кэшировать что-либо - значит сохранить результат дорогостоящих вычислений, чтобы вы не выполняли их в следующий раз, когда они вам понадобятся. Ниже приводится псевдокод, объясняющий, как работает кеширование.

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 поставляется с собственной системой кеширования, которая позволяет сохранять динамические страницы, чтобы при необходимости не вычислять их снова. Хорошим моментом в структуре Django Cache является то, что вы можете кэшировать -

  • Вывод определенного вида.
  • Часть шаблона.
  • Весь ваш сайт.

Чтобы использовать кеш в Django, первое, что нужно сделать, - это указать, где будет храниться кеш. Структура кеширования предлагает различные возможности - кеш может быть сохранен в базе данных, в файловой системе или непосредственно в памяти. Настройка выполняется вsettings.py файл вашего проекта.

Настройка кеша в базе данных

Просто добавьте следующее в файл project settings.py -

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

Чтобы это работало и чтобы завершить настройку, нам нужно создать кеш-таблицу my_table_name. Для этого вам нужно сделать следующее -

python manage.py createcachetable

Настройка кеша в файловой системе

Просто добавьте следующее в файл project settings.py -

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

Настройка кеша в памяти

Это наиболее эффективный способ кэширования, чтобы использовать его, вы можете использовать один из следующих вариантов в зависимости от библиотеки привязки Python, которую вы выбираете для кеширования памяти:

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

Кеширование всего сайта

Самый простой способ использовать кеш в Django - это кешировать весь сайт. Это делается путем редактирования параметра MIDDLEWARE_CLASSES в файле settings.py проекта. Следующее необходимо добавить к опции -

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

Обратите внимание, что здесь важен порядок, обновление должно происходить до промежуточного программного обеспечения Fetch.

Затем в том же файле вам нужно установить -

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

Кеширование представления

Если вы не хотите кэшировать весь сайт, вы можете кэшировать определенное представление. Это делается с помощьюcache_pageдекоратор, поставляемый с Django. Допустим, мы хотим кэшировать результатviewArticles вид -

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)

Как вы видете cache_pageзанимает количество секунд, в течение которых результат просмотра должен быть кэширован в качестве параметра. В нашем примере выше результат будет кэшироваться на 15 минут.

Note - Как мы уже видели ранее, это была карта -

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

Поскольку URL-адрес принимает параметры, каждый вызов будет кэшироваться отдельно. Например, запрос к / myapp / articles / 02/2007 будет кэшироваться отдельно в / myapp / articles / 03/2008.

Кэширование представления также можно выполнить напрямую в файле url.py. Тогда следующий результат будет таким же, как и предыдущий. Просто отредактируйте файл myapp / url.py и измените связанный сопоставленный URL-адрес (см. Выше) на -

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

И, конечно же, он больше не нужен в myapp / views.py.

Кеширование фрагмента шаблона

Вы также можете кэшировать части шаблона, это делается с помощью cacheтег. Возьмем нашиhello.html шаблон -

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

А для кеширования блока контента наш шаблон станет -

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

Как вы можете видеть выше, тег кеша будет принимать 2 параметра - время, в которое вы хотите кэшировать блок (в секундах), и имя, которое будет присвоено фрагменту кеша.