Я боролся с подобной ситуацией, и вот решение, которое я нашел, я запустил его на более ранней версии Django, но в настоящее время оно используется на версии 2.0.3.
Первая проблема: когда вы устанавливаете объекты для кэширования в Django, он устанавливает заголовки так, чтобы последующие кэши, включая кэш браузера, кэшировали вашу страницу.
Чтобы переопределить это, вам нужно установить промежуточное ПО. Я взломал это из других источников на StackOverflow, но пока не могу его найти. В appname/middleware.py
:
from django.utils.cache import add_never_cache_headers
class Disable(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
Затем в settings.py
, к MIDDLEWARE
, добавить:
'appname.middleware.downstream_caching.Disable',
Имейте в виду, что этот подход полностью отключает последующее кэширование, что может не соответствовать вашим ожиданиям.
Наконец, я добавил к своему views.py
:
def expire_page(request, path=None, query_string=None, method='GET'):
"""
:param request: "real" request, or at least one providing the same scheme, host, and port as what you want to expire
:param path: The path you want to expire, if not the path on the request
:param query_string: The query string you want to expire, as opposed to the path on the request
:param method: the HTTP method for the page, if not GET
:return: None
"""
if query_string is not None:
request.META['QUERY_STRING'] = query_string
if path is not None:
request.path = path
request.method = method
# get_raw_uri and method show, as of this writing, everything used in the cache key
# print('req uri: {} method: {}'.format(request.get_raw_uri(), request.method))
key = get_cache_key(request)
if key in cache:
cache.delete(key)
Мне не нравилось передавать объект request
, но на момент написания он предоставляет схему / протокол, хост и порт для запроса, почти любой объект запроса для вашего сайта / приложения будет делать, пока вы передаете путь и строку запроса.