2

モデルのビューレベルのキャッシュを期限切れにしようとしています( https://docs.djangoproject.com/en/1.3/topics/cache/?from=olddocs#the-per-view-cachepost_saveで設定されています) 。私はグーグルをして、この答えをSOで見つけました:Djangoでビューキャッシュを期限切れにしますか?しかし、それは私にとってはうまくいきません。

freenodeの#djangoルームで尋ねたところ、これはおそらく1.3で行われた最近のキャッシュの変更によるものであるというコンセンサスがありました。

キーオフされたモデルのキャッシュエントリを消去する方法について誰かが知っていget_absolute_url()ますか?

4

2 に答える 2

4

私はそれを考え出した!

私を正しい方向に向けてくれたilvarに乾杯。私の実装は以下のとおりです。名前付きのプロパティを作成しcache_key、post_saveレシーバーをモデルのサブクラスに追加しました。モデルのサブクラスのビューレベルのキャッシュは、更新後にクリアする必要がありました。改善のための提案はいつでも歓迎です!

from django.conf import settings
from django.core.cache import cache
from django.db.models.signals import post_save
from django.http import HttpRequest
from django.utils.cache import _generate_cache_header_key

from someapp.models import BaseModelofThisClass

class SomeModel(BaseModelofThisClass):
    ...
    @property
    def cache_key(self):
        # Create a fake request object
        request = HttpRequest()
        # Set the request method
        request.method = "GET"
        # Set the request path to be this object's permalink.
        request.path = self.get_absolute_url()
        # Grab the key prefix (if it exists) from settings
        key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
        # Generate this object's cache key using django's key generator
        key = _generate_cache_header_key(key_prefix, request)
        # This is a bit hacky but necessary as I don't know how to do it
        # properly otherwise. While generating a cache header key, django
        # uses the language of the HttpRequest() object as part of the
        # string. The fake request object, by default, uses
        # settings.LANGUAGE_CODE as it's language (in my case, 'en-us')
        # while the true request objects that are used in building views
        # use settings.LANGUAGES ('en'). Instead of replacing the segment
        # of the string after the fact it would be far better create a more
        # closely mirrored HttpRequest() object prior to passing it to
        # _generate_cache_header_key().
        key = key.replace(settings.LANGUAGE_CODE, settings.LANGUAGES[settings.DEFAULT_LANGUAGE][0])

        return key

    @receiver(post_save)
    def clear_cache_for_this_item(sender, instance, **kwargs):
        # If this is a sub-class of another model
        if sender not in BaseModelofThisClass.__subclasses__():
            return
        else:
            cache.delete(instance.cache_key)
于 2012-05-07T14:59:33.523 に答える
3

Djangoのキャッシングミドルウェアはこれを使用してリクエストのキャッシュキーを生成しています。したがって、目的のパスを使用して偽物requestを作成し、キャッシュキーを取得できます。次に、それをキャッシュから削除します。

PScache_pageデコレータもそのミドルウェアを使用するため、同じように機能するはずです。

于 2012-05-05T04:33:10.903 に答える