sql >> データベース >  >> NoSQL >> Redis

django-redis-cacheでの@cache_page()デコレータの動作

    cache_page デコレータはdjangoデコレータであり、django-redisデコレータではありません。したがって、djangoでmemcachedのようなデフォルトのキャッシュを使用している場合、cache_pageデコレータはmemcachedで同じキーを作成します。これがドキュメント文字列に沿ったデコレータベースコードです:

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

    "" "キャッシュからページを取得しようとし、ページがまだキャッシュにない場合はキャッシュにデータを入力するビューのデコレータ。キャッシュは、URLとヘッダーからの一部のデータによってキー設定されます。さらに、キープレフィックスがあります。マルチサイト設定で異なるキャッシュ領域を区別するために使用されます。たとえば、get_current_site()。domainを使用できます。これは、Djangoproject全体で一意であるためです。さらに、応答のVaryヘッダーのすべてのヘッダーがキャッシュで考慮されます。ミドルウェアのように。"""

    したがって、本質的には、複数のキーを作成します。1つはヘッダー用で、もう1つはHTTPResponseコンテンツ用です。ヘッダーとコンテンツに基づいてキーを作成するため、ヘッダーを変更するとキャッシュが無効になります(たとえば、ヘッダーが異なる場合)。つまり、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
    



    1. 2つのmongodbコレクションを比較する方法は?

    2. MongoDB $ replaceAll

    3. Pythonからredisに無限大を渡すにはどうすればよいですか?

    4. sidekiqでredis認証を構成する