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

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

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

# Файл: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
дано URL, попробуйте найти эту страницу в кэше
 if страница в кэше:
    возвратить кэшированную страницу
 else:
    сгенерировать страницу
    сохранить сгенерированную страницу в кэше (для следующего раза)
    возвратить сгенерированную страницу

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

Вывод определенного вида

Часть шаблона

Вся веб-сайт

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

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

Достаточно добавить следующий код в файл проекта settings.py-

# Файл: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
CACHES = {
    'default': {
       'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
       'LOCATION': 'my_table_name',
    }
 }

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

# Файл: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
python manage.py createcachetable

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

Достаточно добавить следующий код в файл проекта settings.py-

# Файл: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
CACHES = {
    'default': {
       'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
       'LOCATION': '/var/tmp/django_cache',
    }
 }

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

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

# Файл: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
CACHES = {
    'default': {
       'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
       'LOCATION': '127.0.0.1:11211',
    }
 }

или

# Файл: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
CACHES = {
    'default': {
       'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
       'LOCATION': 'unix:/tmp/memcached.sock',
    }
 }

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

Самый простой способ использования的高速 кэша в Django – кэширование всего веб-сайта. Это можно сделать, отредактировав параметр MIDDLEWARE_CLASSES в файле проекта settings.py. Следующие значения необходимо добавить к параметру-

# Файл: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
MIDDLEWARE_CLASSES += (
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
 )

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

Затем в том же файле также необходимо установить_-

# Файл: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
CACHE_MIDDLEWARE_ALIas –_alias_для_хранения_кэша.
 CACHE_MIDDLEWARE_SECONDS – Количество секунд, в течение которых каждая страница должна быть кэширована.

Кэширование вида

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

# Файл: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
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 минут.

Примечание - как мы видели ранее, вышеуказанные виджеты привязаны к -

# Файл: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
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.

Кэширование одного视图 можно также выполнить direkt в файле url.py. Следующие результаты аналогичны вышеуказанным. Достаточно отредактировать файл myapp/url.py и изменить соответствующие URL-мappings (выше) на -

# Файл: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 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'),)

Конечно, он больше не нуждается в myapp/views.py.

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

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

# Файл: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
{% extends "main_template.html" %}
 {% block title %}Моя страница Привет{% endblock %}
 {% block content %}
 Привет, мир!!!<p>Сегодня {{today}}</p>
 Мы
 {% if today.day == 1 %}
 первый день месяца.
 {% elif today == 30 %}
 последний день месяца.
 {% else %}
 Я не знаю.
 {% endif %}
 <p>
    {% for day in days_of_week %}
    {{day}}
 </p>
 {% endfor %}
 {% endblock %}

Шаблон блока кэширования контента станет '-'}}

# Файл: example.py
# Авторское право: 2020 By w3codebox
# Автор: ru.oldtoolbag.com
# Дата: 2020-08-08
{% load cache %}
 {% extends "main_template.html" %}
 {% block title %}Моя страница Привет{% endblock %}
 {% cache 500 content %}
 {% block content %}
 Привет, мир!!!<p>Сегодня {{today}}</p>
 Мы
 {% if today.day == 1 %}
 первый день месяца.
 {% elif today == 30 %}
 последний день месяца.
 {% else %}
 Я не знаю.
 {% endif %}
 <p>
    {% for day in days_of_week %}
    {{day}}
 </p>
 {% endfor %}
 {% endblock %}
 {% endcache %}

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