РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
683 of 818 menu

Декоратор 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,
    который получает значение из кэша
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить