14

シグナルを使用して保存された特定のエントリのキャッシュを消去しようとしています。

私はデコレータ(signalsおよびrender_to)を使用していますdjango-annoying

@signals.post_save(sender=Artigo)
def artigo_post_save(instance, **kwargs):

    from django.http import HttpRequest
    from django.utils.cache import get_cache_key
    from django.core.cache import cache

    # cache.delete(instance.get_absolute_url()) # not work

    request = HttpRequest()
    request.method = "GET"
    request.path = '/' + instance.get_absolute_url()

    print 'request path: ', request.path

    key = get_cache_key(request=request, 
                        key_prefix=settings.CACHE_MIDDLEWARE_KEY_PREFIX)

    print "found key" if cache.has_key(key) else "notfound key"

    if cache.has_key(key):
        cache.delete(key)
        cache.set(key, None, 0)
  • 問題は、モデルを保存すると出力が得られる"notfound key"ため、キャッシュがパージされずに続行されることです
  • request.path私のエントリパスを正しく指しています。

いくつかの設定:

SESSION_ENGINE = "django.contrib.sessions.backends.cache"
CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True
CACHE_MIDDLEWARE_KEY_PREFIX = 'cache'
CACHE_MIDDLEWARE_SECONDS = 600

CACHES = {
    'default': {
            'LOCATION': '',
            'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'
     },
}

そしてビュー:

@cache_page(60 * 60)
@render_to('artigo.html')
def artigo(request, categoria_slug, extra_slug="", artigo_slug=""):
    ...

ありがとうございました。

編集: Ilvar の変更
を行いましたが、現在は戻り値を取得していますが、まだキャッシュを削除できません:"found key"

    key = _generate_cache_header_key(key_prefix=settings.CACHE_MIDDLEWARE_KEY_PREFIX, request=request)
    key = key.replace(settings.LANGUAGE_CODE, settings.LANGUAGES[0][0])

会議:

LANGUAGE_CODE = 'pt-BR'

LANGUAGES = (
        ('pt-BR','Portugues'),
)
  • Gevent サーバーを再起動したときにのみコンテンツが更新されます。
4

1 に答える 1

2

cache.set(key, None, 0) で十分なはずです。以前はキャッシュキーをクリアしていました。

可能であれば、cache.clear() を試してすべてクリアできますか? それが機能するかどうかを確認するだけです。

キャッシュキーはどれも削除できませんか? これの出力は期待どおりですか?

cache.set('testkey', 'testvalue', 600)
cache.get('testkey')
cache.delete('testkey')
cache.get('testkey')
cache.set('testkey', 'testvalue2', 600)
cache.set('testkey', 'another value', 600)
cache.get('testkey')

また、別のキャッシング バックエンドを試してみましたか? あなたがしていることはすべて正しいようです。

たぶん、エラーはバックエンドにあり、キーを上書きできない構成か、何か奇妙なものです..

于 2013-05-29T22:40:56.603 に答える