cache_page
декоратор е django декоратор, а не django-redis декоратор. Така че, ако използвате кеш по подразбиране като memcached в django, декораторът на cache_page щеше да прави същите ключове в memcached. Ето основния код на декоратора покрай низа на документа:
https://github.com/django/django/blob/711123e1cdaf3b08c876c045d8d38decdc7a63d3/django/views/decorators/cache.py#L8
"""Декоратор за изгледи, който се опитва да извлече страницата от кеша и попълва кеша, ако страницата все още не е в кеша. Кешът се задейства от URL адреса и някои данни от заглавките. Освен това има ключов префикс, който е използва се за разграничаване на различни области на кеша в настройка на много сайтове. Можете да използвате theget_current_site().domain, например, тъй като това е уникално в Djangoproject. Освен това всички заглавки от заглавката Vary на отговора ще бъдат взети предвид при кеширането - просто като междинния софтуер."""
Така че по своята същност той създава множество ключове, един за заглавки и друг за съдържанието на HTTPResponse. Той създава ключовете въз основа на заглавката и съдържанието, така че всяка промяна в хедъра обезсилва кеша (например в случай на заглавки vary), т.е. дори със същите параметри в URL адреса, но различно съдържание в заглавките на заявката, ще имате отделни кешове . Примери за различни заглавки на заявки могат да бъдат изпращане на информация за вход за една и съща страница за различни влезли потребители или обслужване на различно съдържание за същия URL адрес въз основа на информацията за мобилен/настолен потребителски агент, присъстваща в заглавките. Ето кода на кеша в 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