sql >> Base de Datos >  >> NoSQL >> Redis

Trabajo del decorador @cache_page() en django-redis-cache

cache_page decorador es un decorador django, no un decorador django-redis. Entonces, si estuviera usando un caché predeterminado como memcached en django, el decorador cache_page habría estado creando las mismas claves en memcached. Aquí está el código base del decorador a lo largo de la cadena de documentación:

https://github.com/django/django/blob/711123e1cdaf3b08c876c045d8d38decdc7a63d3/django/views/decorators/cache.py#L8

"""Decorator para vistas que intenta obtener la página del caché y llena el caché si la página aún no está en el caché. El caché está clave por la URL y algunos datos de los encabezados. Además, está el prefijo clave que es se usa para distinguir diferentes áreas de caché en una configuración de varios sitios. Podría usar el dominio get_current_site()., por ejemplo, ya que es único en un proyecto Django. Además, todos los encabezados del encabezado Vary de la respuesta se tendrán en cuenta en el almacenamiento en caché, solo como lo hace el middleware."""

Entonces, inherentemente, está creando varias claves, una para los encabezados y otra para el contenido de HTTPResponse. Crea las claves basadas en el encabezado y el contenido, de modo que cualquier cambio en el encabezado invalida el caché (por ejemplo, en el caso de encabezados variados), es decir, incluso con los mismos parámetros en la URL, pero contenido diferente en los encabezados de solicitud, tendrá cachés separados . Ejemplos de diferentes encabezados de solicitud pueden ser enviar información de inicio de sesión sobre la misma página para diferentes usuarios registrados, o servir contenido diferente para la misma URL según la información del agente de usuario móvil/de escritorio presente en los encabezados. Aquí está el código de la clave de caché en 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