11

以前は、Django テンプレートに次のようにキャッシュされた HTML のチャンクを設定していました。

{% load cache %}            
    {% cache 10000 courseTable %} <!-- Cached HTML --> {% endcache %}

今、このキャッシュされたコンテンツを更新したので、更新したいと思います。時間を無駄に変更しようとしました:

{% load cache %}            
    {% cache 0 courseTable %} <!-- Updated Cached HTML --> {% endcache %}

この場合、ページにはキャッシュされた古い HTML が引き続き表示されます。

また、キャッシングに関連するテンプレート タグを削除して再挿入してみました。ただし、この場合、キャッシュ テンプレート タグを再挿入すると、コンテンツは元のキャッシュされたコンテンツに戻ります。

私に何ができる?キャッシュをリロードするのに約 2 時間待ちたくありません。

4

3 に答える 3

14

Django 1.6+ の場合、およびDjango ドキュメントから、探しているパーシャルのキーを生成して削除するだけです。

from django.core.cache import cache
from django.core.cache.utils import make_template_fragment_key

# cache key for {% cache 500 sidebar username %} templatetag
key = make_template_fragment_key('sidebar', [username])
cache.delete(key) # invalidates cached template fragment

make_template_fragment_key以前に定義しcourseTableた引数で呼び出すだけです。

于 2017-03-09T21:39:53.043 に答える
8

memcached を完全に空にする余裕がある場合は、flush_allcmd を実行するか、単に

from django.core.cache import cache
cache.clear()

または、キャッシュキーを手動で生成する必要があります。キーのtimeout有効期限が切れるまで、 は更新されません。

于 2012-05-28T04:47:16.630 に答える
2

Django 1.6 より前では、cacheテンプレート タグは多かれ少なかれタグの定義の本文にキャッシュ キーを作成していました (こちらを参照)。1.6 以降、テンプレート フラグメント キャッシュ キーはdjango.core.cache.utils.make_template_fragment_key関数を使用して構築されています (こちらを参照)。

いずれの場合でも、次のように使用または定義make_template_fragment_keyしてキャッシュ キーを取得することにより、キャッシュされた特定のフラグメントを削除できます。

from __future__ import unicode_literals

import hashlib
from django.core.cache import cache
from django.utils.encoding import force_bytes
from django.utils.http import urlquote

TEMPLATE_FRAGMENT_KEY_TEMPLATE = 'template.cache.%s.%s'


def make_template_fragment_key(fragment_name, vary_on=None):
    if vary_on is None:
        vary_on = ()
    key = ':'.join(urlquote(var) for var in vary_on)
    args = hashlib.md5(force_bytes(key))
    return TEMPLATE_FRAGMENT_KEY_TEMPLATE % (fragment_name, args.hexdigest())


def delete_cached_fragment(fragment_name, *args):
    cache.delete(make_template_fragment_key(fragment_name, args or None))


delete_cached_fragment('my_fragment', 'other', 'vary', 'args')

このコードは django コードベースから直接コピーされているため、このライセンスと著作権が適用されます。

于 2015-01-18T23:34:50.297 に答える