Декоратор cache_page
Декоратор cache_page применяется к функциям представления или классам и кеширует весь сгенерированный ответ на указанное количество секунд. При последующих запросах к этому же URL, Django отдает закешированную версию страницы, не выполняя код представления и не обращаясь к базе данных. Декоратор принимает один обязательный аргумент - время кеширования в секундах, а также необязательный аргумент для указания префикса кеша.
Синтаксис
from django.views.decorators.cache import cache_page
@cache_page(timeout, key_prefix=None)
def view_function(request):
# код представления
return render(request, 'template.html', context)
Пример . Для функции представления
Давайте закешируем главную страницу на 60 секунд:
from django.shortcuts import render
from django.views.decorators.cache import cache_page
from myapp.models import Article
@cache_page(60)
def index(request):
articles = Article.objects.all()
return render(request, 'index.html', {'articles': articles})
После первого запроса результат будет сохранен в кеше на 60 секунд. В течение этого времени все последующие запросы к странице будут получать закешированную версию без выполнения запросов к базе данных.
Пример . Для классов представления
Для классовых представлений декоратор применяется через метод as_view:
from django.views.generic import ListView
from django.views.decorators.cache import cache_page
from django.utils.decorators import method_decorator
from myapp.models import Article
class ArticleListView(ListView):
model = Article
template_name = 'articles/list.html'
context_object_name = 'articles'
@method_decorator(cache_page(120))
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
Пример . С указанием префикса
Аргумент key_prefix позволяет задать уникальный префикс для ключа кеша, что полезно при использовании нескольких кешей или версий страницы:
from django.shortcuts import render
from django.views.decorators.cache import cache_page
from myapp.models import Category
@cache_page(300, key_prefix='category_list_v1')
def category_list(request):
categories = Category.objects.filter(is_active=True)
return render(request, 'categories.html', {'categories': categories})
Пример . С динамическим временем кеширования
Время кеширования можно вычислить динамически, обернув декоратор в функцию:
from django.shortcuts import render
from django.views.decorators.cache import cache_page
from django.conf import settings
def dynamic_cache_page(timeout):
return cache_page(timeout, key_prefix='dynamic_page')
@dynamic_cache_page(settings.CACHE_TIMEOUT)
def dynamic_view(request):
# код представления
return render(request, 'dynamic.html')
Смотрите также
-
декоратор
cache_control,
который управляет заголовками HTTP-кеширования -
декоратор
never_cache,
который запрещает кеширование страницы -
тег шаблона
cache,
который кеширует отдельные фрагменты шаблона -
метод
set,
который сохраняет данные в кеш вручную