Декоратор cache_control
Декоратор cache_control применяется к функциям представления
и позволяет установить заголовки Cache-Control для HTTP-ответа.
Это дает возможность управлять кэшированием на стороне клиента
и промежуточных прокси-серверов. Декоратор принимает именованные
аргументы, соответствующие директивам заголовка Cache-Control.
Синтаксис
from django.views.decorators.cache import cache_control
@cache_control(directive1=value1, directive2=value2)
def view_function(request):
# код представления
return render(request, 'template.html')
Основные директивы
Декоратор поддерживает следующие основные директивы:
# Максимальное время кэширования в секундах
@cache_control(max_age=3600)
# Запрет кэширования
@cache_control(no_cache=True)
# Запрет сохранения кэша на диске
@cache_control(no_store=True)
# Только для приватного кэша
@cache_control(private=True)
# Только для публичных кэшей
@cache_control(public=True)
# Обязательная проверка свежести
@cache_control(must_revalidate=True)
# Максимальная устаревшая версия
@cache_control(max_stale=3600)
# Минимальная свежесть
@cache_control(min_fresh=60)
Пример . С max_age
Давайте ограничим время кэширования страницы одной минутой:
from django.views.decorators.cache import cache_control
from django.shortcuts import render
from myapp.models import Article
@cache_control(max_age=60)
def article_list(request):
articles = Article.objects.all()
return render(request, 'articles.html', {'articles': articles})
Результат выполнения кода:
"Cache-Control: max-age=60"
Пример . С комбинацией директив
Создадим представление, которое запрещает кэширование и требует проверки свежести:
from django.views.decorators.cache import cache_control
from django.shortcuts import render
from myapp.models import User
@cache_control(no_cache=True, must_revalidate=True)
def user_profile(request, user_id):
user = User.objects.get(id=user_id)
return render(request, 'profile.html', {'user': user})
Результат выполнения кода:
"Cache-Control: no-cache, must-revalidate"
Пример . С публичным кэшированием
Настроим публичное кэширование для статической страницы на 24 часа:
from django.views.decorators.cache import cache_control
from django.shortcuts import render
from datetime import datetime
@cache_control(public=True, max_age=86400)
def about_page(request):
context = {
'current_year': datetime.now().year,
}
return render(request, 'about.html', context)
Результат выполнения кода:
"Cache-Control: public, max-age=86400"
Пример . С приватным кэшированием
Создадим страницу, которая должна кэшироваться только на клиенте:
from django.views.decorators.cache import cache_control
from django.shortcuts import render
from myapp.models import Category
@cache_control(private=True, max_age=600)
def user_dashboard(request):
categories = Category.objects.all()
return render(request, 'dashboard.html', {'categories': categories})
Результат выполнения кода:
"Cache-Control: private, max-age=600"
Пример . С запретом сохранения
Настроим страницу, которая не должна сохраняться в кэше:
from django.views.decorators.cache import cache_control
from django.shortcuts import render
from myapp.models import Article
@cache_control(no_store=True, no_cache=True)
def article_create(request):
if request.method == 'POST':
# Обработка создания статьи
pass
return render(request, 'article_form.html')
Результат выполнения кода:
"Cache-Control: no-cache, no-store"
Смотрите также
-
декоратор
cache_page,
который кэширует ответ представления на сервере -
декоратор
never_cache,
который добавляет запрет на кэширование ответа -
метод
get,
который получает значение из кэша -
метод
set,
который устанавливает значение в кэш