cache_page
dekorator adalah dekorator django, bukan dekorator django-redis. Jadi, jika Anda menggunakan cache default seperti memcached di Django, dekorator cache_page akan membuat kunci yang sama di memcached. Berikut adalah kode dasar dekorator di sepanjang doc string :
https://github.com/django/django/blob/711123e1cdaf3b08c876c045d8d38decdc7a63d3/django/views/decorators/cache.py#L8
"""Dekorator untuk tampilan yang mencoba mendapatkan halaman dari cache dan mengisi cache jika halaman belum ada di cache. Cache dikunci oleh URL dan beberapa data dari header. Selain itu ada awalan kunci yang digunakan untuk membedakan area cache yang berbeda dalam pengaturan multi-situs. Anda dapat menggunakan domain get_current_site()., misalnya, karena itu unik di seluruh proyek Django. Selain itu, semua header dari header Vary respons akan diperhitungkan pada caching -- hanya seperti yang dilakukan middleware."""
Jadi, secara inheren itu membuat beberapa kunci, satu untuk header dan lainnya untuk konten HTTPResponse. Itu membuat kunci berdasarkan tajuk dan konten, sehingga setiap perubahan di tajuk membatalkan cache (misalnya dalam kasus tajuk bervariasi), yaitu bahkan dengan parameter yang sama di url, tetapi konten yang berbeda di header permintaan Anda akan memiliki cache terpisah . Contoh tajuk permintaan yang berbeda dapat mengirimkan info masuk tentang halaman yang sama untuk pengguna masuk yang berbeda, atau menyajikan konten berbeda untuk url yang sama berdasarkan informasi agen pengguna seluler/desktop yang ada di tajuk. Berikut adalah kode kunci cache di 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