cache_page
decorateur is een django-decorateur, geen django-redis-decorateur. Dus als je een standaardcache zoals memcached in django zou gebruiken, zou de cache_page decorateur dezelfde sleutels in memcached hebben gemaakt. Hier is de decorator-basiscode langs de doc-string:
https://github.com/django/django/blob/711123e1cdaf3b08c876c045d8d38decdc7a63d3/django/views/decorators/cache.py#L8
"""Decorator voor weergaven die probeert de pagina uit de cache te halen en de cache vult als de pagina zich nog niet in de cache bevindt. De cache wordt gecodeerd door de URL en sommige gegevens uit de headers. Bovendien is er het sleutelprefix dat gebruikt om verschillende cachegebieden te onderscheiden in een installatie met meerdere sites. U kunt bijvoorbeeld theget_current_site().domain gebruiken, omdat dat uniek is in een Djangoproject. zoals de middleware doet."""
Dus inherent is het het creëren van meerdere sleutels, één voor headers en andere voor de HTTPResponse-inhoud. Het maakt de sleutels op basis van header en inhoud, zodat elke wijziging in header de cache ongeldig maakt (bijvoorbeeld in het geval van verschillende headers), d.w.z. zelfs met dezelfde parameters in de url, maar met verschillende inhoud in request-headers, heeft u aparte caches . Voorbeelden van verschillende verzoekheaders kunnen het verzenden van aanmeldingsinformatie over dezelfde pagina voor verschillende ingelogde gebruikers zijn, of het aanbieden van verschillende inhoud voor dezelfde url op basis van mobiele/desktop user agent-informatie die aanwezig is in headers.Hier is de cachesleutelcode in django:
def _generate_cache_key(request, method, headerlist, key_prefix):
"""Return a cache key from the headers given in the header list."""
ctx = hashlib.md5()
for header in headerlist:
value = request.META.get(header)
if value is not None:
ctx.update(force_bytes(value))
url = hashlib.md5(force_bytes(iri_to_uri(request.build_absolute_uri())))
cache_key = 'views.decorators.cache.cache_page.%s.%s.%s.%s' % (
key_prefix, method, url.hexdigest(), ctx.hexdigest())
return _i18n_cache_key_suffix(request, cache_key)
def _generate_cache_header_key(key_prefix, request):
"""Return a cache key for the header cache."""
url = hashlib.md5(force_bytes(iri_to_uri(request.build_absolute_uri())))
cache_key = 'views.decorators.cache.cache_header.%s.%s' % (
key_prefix, url.hexdigest())
return _i18n_cache_key_suffix(request, cache_key)
def get_cache_key(request, key_prefix=None, method='GET', cache=None):
"""
Return a cache key based on the request URL and query. It can be used
in the request phase because it pulls the list of headers to take into
account from the global URL registry and uses those to build a cache key
to check against.
If there isn't a headerlist stored, return None, indicating that the page
needs to be rebuilt.
"""
if key_prefix is None:
key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
cache_key = _generate_cache_header_key(key_prefix, request)
if cache is None:
cache = caches[settings.CACHE_MIDDLEWARE_ALIAS]
headerlist = cache.get(cache_key)
if headerlist is not None:
return _generate_cache_key(request, method, headerlist, key_prefix)
else:
return None