Ответ 1
Вы можете достичь этого, используя декоратор cache_control. Пример из документация:
from django.views.decorators.cache import never_cache
@never_cache
def myview(request):
# ...
Я использую ярлык render_to_response и не хочу создавать конкретный объект Response для добавления дополнительных заголовков для предотвращения кеширования на стороне клиента.
Я хотел бы получить ответ, содержащий:
И все другие отличные способы, которыми браузеры, как мы надеемся, интерпретируют как директивы, чтобы избежать кеширования.
Существует ли промежуточное программное обеспечение без кэша или что-то подобное, что может сделать трюк с минимальным вторжением кода?
Вы можете достичь этого, используя декоратор cache_control. Пример из документация:
from django.views.decorators.cache import never_cache
@never_cache
def myview(request):
# ...
Этот подход (небольшая модификация решения L. De Leo) с использованием специального промежуточного программного обеспечения хорошо зарекомендовал себя как решение для всего сайта:
from django.utils.cache import add_never_cache_headers
class DisableClientSideCachingMiddleware(object):
def process_response(self, request, response):
add_never_cache_headers(response)
return response
Это использует add_never_cache_headers
.
Если вы хотите объединить это с UpdateCacheMiddleware
и FetchFromCacheMiddleware
, чтобы включить кеширование на стороне сервера при отключении кеширования на стороне клиента, вам нужно добавить DisableClientSideCachingMiddleware
перед всем остальным, например:
MIDDLEWARE_CLASSES = (
'custom.middleware.DisableClientSideCachingMiddleware',
'django.middleware.cache.UpdateCacheMiddleware',
# ... all other middleware ...
'django.middleware.cache.FetchFromCacheMiddleware',
)
В дополнение к существующим ответам. Вот декоратор, который добавляет дополнительные заголовки для отключения кэширования:
from django.views.decorators.cache import patch_cache_control
from functools import wraps
def never_ever_cache(decorated_function):
"""Like Django @never_cache but sets more valid cache disabling headers.
@never_cache only sets Cache-Control:max-age=0 which is not
enough. For example, with max-axe=0 Firefox returns cached results
of GET calls when it is restarted.
"""
@wraps(decorated_function)
def wrapper(*args, **kwargs):
response = decorated_function(*args, **kwargs)
patch_cache_control(
response, no_cache=True, no_store=True, must_revalidate=True,
max_age=0)
return response
return wrapper
И вы можете использовать его как:
class SomeView(View):
@method_decorator(never_ever_cache)
def get(self, request):
return HttpResponse('Hello')
На самом деле написать собственное промежуточное программное обеспечение было достаточно просто:
from django.http import HttpResponse
class NoCacheMiddleware(object):
def process_response(self, request, response):
response['Pragma'] = 'no-cache'
response['Cache-Control'] = 'no-cache must-revalidate proxy-revalidate'
return response
Все еще не ведет себя так, как я хотел, но так же и декоратор @never_cache
Что касается браузера Google Chrome (версия 34.0.1847.116 м) и других браузеров, я обнаружил, что работает только декоратор @cache_control
. Я использую Django 1.6.2.
Используйте его следующим образом:
@cache_control(max_age=0, no_cache=True, no_store=True, must_revalidate=True)
def view(request):
...
Вот переписка @Meilo answer для Django 1.10 +:
from django.utils.cache import add_never_cache_headers
class DisableClientCachingMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
add_never_cache_headers(response)
return response