3

Djangoサイトを開発しました。dabataseのモデルインスタンスとサイトのページの間には、ほぼ1対1の関係があります。

サイトの各ページをキャッシュしたい(キャッシュバックエンドとしてmemcachedを使用)。サイトはそれほど大きくありません—封筒裏の計算によると、全体がかなり少量のRAMに収まるはずです—データは特に頻繁に変更されないため、サイト全体が効果的に機能します。キャッシュ内。

ただし、データが変更された場合は、キャッシュにそれをすぐに反映させたいので、理想的には、各モデルインスタンスが保存時にキャッシュから独自のページをクリアできるようにします。

私が想像した方法は、URLをキーとしてページをキャッシュすることです。次に、各モデルインスタンスは、そのURL(を介して認識get_absolue_url())を使用して、キャッシュからページをクリアできます。

DjangoのサイトごとのキャッシュメカニズムでページのURLをキャッシュキーとして使用するようにできますか?

4

1 に答える 1

2

私はキャッシュ キーを制御するオプションを知りません。また、Django での実装では、そのようなオプションがあることは示唆されていません。キャッシュ ミドルウェアを介してリクエストのキャッシュ キーを生成するコードは、django.utils.cache.get_cache_key(キャッシュからフェッチする場所を知るため) およびlearn_cache_key(キャッシュを設定する場所を知るため) に存在します。次のように、ヘッダーを考慮しないようにこれらの関数にモンキー パッチを適用できます。

from django.utils import cache
from django.conf import settings

def get_path_cache_key(request, key_prefix=None):
    if key_prefix is None:
        key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
    return cache._generate_cache_key(request, [], key_prefix)
    # passing an empty headerlist so only request.path is taken into account

cache.get_cache_key = get_path_cache_key
cache.learn_cache_key = get_path_cache_key

これにより、内部的にパスの MD5 ハッシュが取得され、潜在的なプレフィックスが追加され、現在のロケール (言語) も考慮されます。さらに変更して、接頭辞と言語を省略できます。ドキュメントによると、memcached では 250 文字を超えるキーや空白を含むキーは許可されないため、ハッシュせずにプレーン パスを使用することはお勧めしません。get_path_cache_keyからも URL に適用し、get_absolute_url()そのページをクリアできるため、これは問題になりません。

于 2011-12-16T00:43:41.327 に答える