English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Чтобы кэшировать результаты дорогих вычислений, которые не нужно выполнять снова при следующем использовании, вот пример伪-кода, объясняющего, как это работает:
# Файл: 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 параметра - блок, который нужно кэшировать (в секундах), и имя, предоставляемое фрагменту кэша.