Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Funcionamento do decorador @cache_page() no django-redis-cache


cache_page decorator é um decorador django, não um decorador django-redis. Então, se você estivesse usando um cache padrão como o memcached no django, o decorador cache_page estaria fazendo as mesmas chaves no memcached. Aqui está o código base do decorador junto com a string doc :

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

"""Decorador para visualizações que tenta obter a página do cache e preenche o cache se a página ainda não estiver no cache.O cache é codificado pela URL e alguns dados dos cabeçalhos.Além disso, há o prefixo de chave que é usado para distinguir diferentes áreas de cache em uma configuração de vários sites. Você pode usar o domínio get_current_site(), por exemplo, pois ele é único em um projeto Django. Além disso, todos os cabeçalhos do cabeçalho Vary da resposta serão levados em consideração no armazenamento em cache -- apenas como o middleware faz."""

Portanto, inerentemente, está criando várias chaves, uma para cabeçalhos e outra para o conteúdo HTTPResponse. Ele cria as chaves com base no cabeçalho e no conteúdo, para que qualquer alteração no cabeçalho invalide o cache (por exemplo, no caso de cabeçalhos variados), ou seja, mesmo com os mesmos parâmetros na url, mas conteúdo diferente nos cabeçalhos de solicitação, você terá caches separados . Exemplos de diferentes cabeçalhos de solicitação podem enviar informações de login sobre a mesma página para diferentes usuários logados ou servir conteúdo diferente para a mesma url com base nas informações do agente do usuário móvel/desktop presentes nos cabeçalhos.Aqui está o código da chave de cache em 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