1

この問題は私を午前中ずっと悩ませてきました:

  • GETパラメータを受け入れてクエリセット(order_byとpagination)を変更し、キャッシュするビューがいくつかあります。
  • これらのビューは非常によく似ており、すべて同じテンプレートを共有しています。
  • これらのテンプレートは、次のようにページの一部をキャッシュします(GETパラメーターを考慮に入れます)。

    {% with order=request.GET.order_by %}{% with page=request.GET.page %}{# I need them to set the cache name #}
    {% cache 7200 template urlname order page %}
    .... some part of the page...
    {% endcache %}
    {% endwith %}{% endwith %}{# with order and with page #}
    
  • クエリセットキャッシュの削除は簡単ですが、テンプレートキャッシュの削除は非常に複雑であることが証明されています。通常、DOCSで説明されているように、cache_keyを生成する必要があります。私の場合の問題は、キーの可能なすべての組み合わせを生成して削除する必要があることです。これは次のように実行しています。

    SITE_LIST_OPTIONS = [
        ('url', [reverse_lazy('site_list'),
                 reverse_lazy('best_site_list'),
                 reverse_lazy('banned_site_list'),
                 reverse_lazy('toreview_site_list')]),
        ('order', ['url', 'country', 'upstream_rank']),
        ('page', range(10))]
    
    
    def delete_cache_keys(keys):
        '''Deletes all the cache keys on the provided list.'''
        for e in keys:
            cache.delete(e)
    
    
    def delete_template_cache(key, filters=None):
        # first, we need to get all possible filter combination options
        if filters:
            options = combine_options(filters)
            keys = [make_template_fragment_key(key, ops) for ops in options]
            delete_cache_keys(keys)
        else:
            key = make_template_fragment_key(key, filters)
            cache.delete(key)
    
    # context_processor.py (used to generate key in template)
    
    def urlname(request):
        return {'urlname': resolve_urlname(request)}
    

GETパラメータに基づいてテンプレートをキャッシュしようとしたのは私が初めてではないので、この特定のテンプレートに関連するすべてのキャッシュを削除するための賢明な方法はありますか?

編集:フォーマットが表示されない理由はわかりませんが、http://dpaste.org/XYYo2/に備えてよりクリーンなバージョンがあります

4

1 に答える 1

0

テンプレートにバインドされたグループキャッシュキーを与えることで、テンプレートのキャッシュされたすべてのスニペットをグループ化できます。テンプレートに関連するすべてのコンテンツを無効にする場合は、テンプレートのグループキーをクリアするだけです。

>>> from django.core.cache import cache

>>> template_name = 'foo.html'
>>> cache.set(template_name, 1)
>>> make_group_key = lambda: '{name}-{version}'.format(
        name=template_name, version=cache.get(template_name))
>>> cache.set(make_group_key(), 'page content...')
>>> cache.get(make_group_key())
'page content...'

>>> cache.incr(template_name)
>>> cache.get(make_group_key()) is None
True

コードの場合、次のように、グループキーをコンテキストに伝達するテンプレートタグを記述できます。

{% get_template_key template as tmpl_key %}
{% cache 7200 template urlname order page tmpl_key %}

または、ビューまたは他の場所でキーを生成できます。

その場合、削除部分は次のように単純cache.incr(template_name)です(template_nameが存在しないという例外を処理する必要がある場合があります)

この方法では、キャッシュのラウンドトリップが追加されますが、通常は十分に高速です。

于 2013-03-25T14:59:13.133 に答える