Декоратор never_cache
Декоратор never_cache применяется к функциям представлений и добавляет в HTTP-ответ заголовки, запрещающие кэширование. Это особенно полезно для страниц, содержащих конфиденциальную информацию, личные данные пользователя или результаты действий, которые должны всегда отображаться в актуальном состоянии. Декоратор устанавливает заголовки Cache-Control: max-age=0, no-cache, no-store, must-revalidate и Pragma: no-cache, а также добавляет отрицательный заголовок Expires.
Синтаксис
from django.views.decorators.cache import never_cache
@never_cache
def my_view(request):
# код представления
return render(request, 'template.html')
Декоратор принимает один аргумент - функцию представления, и возвращает обернутую функцию, которая добавляет необходимые заголовки к ответу.
Пример . Для страницы профиля пользователя
Рассмотрим представление, которое отображает личный кабинет пользователя. Такая страница не должна кэшироваться, чтобы всегда показывать актуальные данные:
from django.shortcuts import render
from django.views.decorators.cache import never_cache
from django.contrib.auth.decorators import login_required
@login_required
@never_cache
def profile_view(request):
user = request.user
context = {
'username': user.username,
'email': user.email,
'last_login': user.last_login,
}
return render(request, 'profile.html', context)
Результат выполнения кода:
"Response headers: Cache-Control: max-age=0, no-cache, no-store, must-revalidate"
"Response headers: Pragma: no-cache"
"Response headers: Expires: Thu, 01 Jan 1970 00:00:00 GMT"
Теперь при каждом запросе к профилю пользователя браузер будет загружать свежую версию страницы.
Пример . Для страницы после изменения данных
Декоратор часто применяется к представлениям, которые обрабатывают POST-запросы и перенаправляют пользователя после успешного действия. Например, после редактирования статьи:
from django.shortcuts import redirect, render
from django.views.decorators.cache import never_cache
from myapp.models import Article
from django.contrib import messages
@never_cache
def edit_article(request, article_id):
article = Article.objects.get(id=article_id)
if request.method == 'POST':
article.title = request.POST.get('title')
article.content = request.POST.get('content')
article.save()
messages.success(request, 'Article updated successfully!')
return redirect('article_detail', article_id=article.id)
return render(request, 'edit_article.html', {'article': article})
Результат выполнения кода при POST-запросе:
"Article updated successfully!"
"Redirecting to article detail page with no-cache headers"
Если не использовать декоратор, браузер мог бы показать устаревшую версию страницы с предыдущими данными, что привело бы к путанице у пользователя.
Пример . Комбинирование с другими декораторами
Декоратор never_cache можно комбинировать с другими декораторами, например, с cache_control для тонкой настройки политики кэширования. Важно соблюдать порядок их применения:
from django.views.decorators.cache import never_cache, cache_control
from django.views.decorators.vary import vary_on_headers
from django.shortcuts import render
@vary_on_headers('User-Agent')
@never_cache
@cache_control(private=True)
def sensitive_data_view(request):
# Данные, которые не должны кэшироваться
data = {
'secret_key': 'abc123',
'session_id': request.session.session_key,
}
return render(request, 'sensitive.html', data)
Результат выполнения кода:
"Response headers: Cache-Control: max-age=0, no-cache, no-store, must-revalidate, private"
"Response headers: Pragma: no-cache"
"Response headers: Vary: User-Agent"
В этом примере декораторы применяются снизу вверх: сначала cache_control добавляет заголовок private, затем never_cache добавляет свои заголовки, и наконец vary_on_headers добавляет заголовок Vary. Это гарантирует, что ответ никогда не будет сохранен в кэше.
Смотрите также
-
декоратор
cache_page,
который кэширует ответ страницы на заданное время -
декоратор
cache_control,
который добавляет заголовки управления кэшированием -
метод
set,
который сохраняет значение в кэш -
метод
get,
который получает значение из кэша