19

djangoプロジェクトにビューキャッシングを使用しています。

キャッシュはURLをキーとして使用すると書かれているので、ユーザーがオブジェクトを更新/削除した場合に、キーの1つのキャッシュをクリアする方法を考えています。

例:ユーザーがブログ投稿をdomain.com/post/1234/..に投稿する場合、ユーザーがそれを編集した場合、編集された投稿を保存するビューの最後に何らかの削除キャッシュコマンドを追加して、そのURLのキャッシュバージョンを削除したいと思います。

私が使用しているもの:

@cache_page(60 * 60)
def post_page(....):

post.idが1234の場合、これは機能するように見えますが、そうではありません。

def edit_post(....):
    # stuff that saves the edits
    cache.delete('/post/%s/' % post.id)
    return Http.....
4

3 に答える 3

29

django cache docsから、それでcache.delete('key')十分だと言われています。それで、あなたが持っているかもしれない2つの問題が私の頭に浮かびます:

  1. インポートが正しくありません。モジュールcacheからインポートする必要があることに注意してください。django.core.cache

    from django.core.cache import cache
    
    # ...
    cache.delete('my_url')
    
  2. 使用しているキーが正しくありません(「domain.com」を含む完全なURLを使用している可能性があります)。シェルに入力できる正確なURLを確認するには、次のようにします。

    $ ./manage.py shell
    >>> from django.core.cache import cache
    >>> cache.has_key('/post/1234/')
    # this will return True or False, whether the key was found or not
    # if False, keep trying until you find the correct key ...
    >>> cache.has_key('domain.com/post/1234/') # including domain.com ?
    >>> cache.has_key('www.domain.com/post/1234/') # including www.domain.com ?
    >>> cache.has_key('/post/1234') # without the trailing / ?
    
于 2012-01-09T06:12:40.150 に答える
1

テキストから始まるキーを削除する関数を作成します。これは、動的キーを削除するのに役立ちます。

キャッシュされた投稿のリスト

def get_posts(tag, page=1):
    cached_data = cache.get('list_posts_home_tag%s_page%s' % (tag, page))
    if not cached_data:
        cached_data = mycontroller.get_posts(tag, page)
        cache.set('list_posts_home_tag%s_page%s' % (tag, page), cached_data, 60)
    return cached_data

投稿を更新するときは、 flush_cache

def update(data):
    response = mycontroller.update(data)
    flush_cache('list_posts_home')
    return response

動的キャッシュを削除するためのflush_cache

def flush_cache(text):
    for key in list(cache._cache.keys()):
        if text in key:
            cache.delete(key.replace(':1:', ''))

djangoからキャッシュをインポートすることを忘れないでください

from django.core.cache import cache
于 2018-09-18T19:43:34.583 に答える
0

これに役立つかもしれないトリックがあります。デコレータは、のcache_pageオプションの引数を取りますkey_prefix。たとえば、1つのキャッシュに複数のサイトがある場合に使用することになっています。ドキュメントの内容は次のとおりです。

CACHE_MIDDLEWARE_KEY_PREFIX–同じDjangoインストールを使用してキャッシュが複数のサイト間で共有されている場合は、キーの衝突を防ぐために、これをサイトの名前、またはこのDjangoインスタンスに固有の他の文字列に設定します。気にしない場合は、空の文字列を使用してください。

ただし、複数のサイトがない場合は、次のように悪用できます。

cache_page(cache_length, key_prefx="20201215")

プレフィックスとして日付を使用したので、必要に応じて新しい無効化キーを簡単にローテーションできます。これはうまくいくはずです。

でも!このトリックを使用している場合、一部のキャッシュ(DBキャッシュ、ファイルシステムキャッシュなど)は、アクセスされている場合を除いて、期限切れのエントリをクリーンアップしないことに注意してください。上記のトリックを使用すると、キャッシュエントリに再度アクセスすることはなく、クリアするまでキャッシュエントリが残ります。おそらく問題ではありませんが、検討する価値があります。

于 2020-12-16T00:31:42.830 に答える