sql >> Databáze >  >> NoSQL >> Redis

Fungování dekorátoru @cache_page() v django-redis-cache

cache_page dekoratér je dekoratér django, nikoli dekoratér django-redis. Pokud byste tedy používali výchozí mezipaměť, jako je memcached v django, dekorátor cache_page by vytvořil stejné klíče v memcached. Zde je základní kód dekorátoru podél řetězce doc:

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

"""Dekorátor pro zobrazení, který se pokouší získat stránku z mezipaměti a naplní mezipaměť, pokud stránka ještě není v mezipaměti. Mezipaměť je klíčována adresou URL a některými daty ze záhlaví. Navíc je zde předpona klíče, která je používá se k rozlišení různých oblastí mezipaměti v nastavení více webů. Můžete například použít doménu get_current_site().domain, protože je jedinečná v rámci projektu Django. Kromě toho budou při ukládání do mezipaměti zohledněna všechna záhlaví z hlavičky Vary odpovědi – pouze stejně jako middleware."""

Takže ze své podstaty vytváří několik klíčů, jeden pro záhlaví a druhý pro obsah HTTPResponse. Vytváří klíče na základě hlavičky a obsahu, takže jakákoli změna v hlavičce znehodnotí mezipaměť (například v případě různých hlaviček), tj. i se stejnými parametry v url, ale s jiným obsahem v hlavičkách požadavků budete mít samostatné mezipaměti . Příklady různých hlaviček požadavků mohou být odesílání přihlašovacích údajů o stejné stránce pro různé přihlášené uživatele nebo poskytování různého obsahu pro stejnou adresu URL na základě informací o uživatelském agentovi pro mobilní zařízení/počítače v hlavičkách. Zde je kód klíče mezipaměti v 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



  1. Jak promítnout index pole po rozvinutí pole pomocí agregačního rámce MongoDB

  2. Začínáme s ovladačem MongoDB Go Driver

  3. Převeďte ObjectID (Mongodb) na String v JavaScriptu

  4. MongoDB pomocí klauzule OR v mongoengine