2011-11-11 4 views
3

私はMemcacheを私のDjangoアプリケーションに使用しています。Djangoでテンプレートフラグメントキャッシュを明示的にリセットするにはどうすればいいですか?

Djangoでは、テンプレートの一部だけをキャッシュするために、テンプレートフラグメントキャッシュを使用できます。 https://docs.djangoproject.com/en/dev/topics/cache/#template-fragment-caching

views.pyのようなテンプレートフラグメントキャッシュセクションの値を明示的に変更する方法があるのだろうかと思っていました。たとえば、テンプレートフラグメントキャッシュ以外のcache.set( "sidebar"、 "new value")に似たメソッドを使用できますか?

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

答えて

6

理論上、はい。最初this snippet of codeで行うことができますジャンゴで使用したのと同じパターンでテンプレートキャッシュキーを作成する必要があります。

from django.utils.hashcompat import md5_constructor 
from django.utils.http import urlquote 

def template_cache_key(fragment_name, *vary_on): 
    """Builds a cache key for a template fragment. 

    This is shamelessly stolen from Django core. 
    """ 
    base_cache_key = "template.cache.%s" % fragment_name 
    args = md5_constructor(u":".join([urlquote(var) for var in vary_on])) 
    return "%s.%s" % (base_cache_key, args.hexdigest()) 

あなたはそれを変更するcache.set(template_cache_key(sidebar), 'new content')ような何かを行うことができます。

ただし、ビューでこれを行うのは醜いです。モデルが変更されたときには、post-save signalsを設定してキャッシュエントリを期限切れにする方が理にかなっています。

上記のコードスニペットは、Django 1.2以下で動作します。私はDjango 1.3互換性についてはわかりません。 django/templatetags/cache.pyに最新の情報があります。

Django 1.7の場合、django/core/cache/utils.pyには使用可能な機能があります。

+0

Django 1.7では動作しません... –

+0

@SimonSteinberger:うん、少し修正する必要があります。 https://github.com/django/django/blob/master/django/core/cache/utils.py – mipadi

+1

ここに記載されている機能をコピーまたは使用してください: https:///docs.djangoproject.com/ja/dev/topics/cache/#django.core.cache.utils.make_template_fragment_key –

関連する問題