Django中的全局变量/变量缓存

时间:2011-12-08 12:27:36

标签: python django caching django-cache django-caching

在我的网站中,我想向用户展示侧边栏中多数页面中浏览次数最多的产品类别。

所以在每个不同的视图中我都有:

variables = RequestContext(request, {
   (...)
   'most_viewed_cats': calculate_most_viewed_categories()
}

并在各种模板中

{% include "list_most_viewed_categories" %}

并在那一个:

<ul>
{% for cat in most_viewed_cats %}
    {{ cat.name }}
{% empty %}
    </ul>No categories to show.<ul>
{% endfor %} 
</ul>

但是,我想每2天左右计算一次most_viewed_categories值,而不是在每个视图中计算它。

我知道可以缓存视图,但这更像是一个变量缓存。是否可以在Django服务器中的某处缓存此变量并仅在该段时间后更新它?怎么会这样做?

谢谢

1 个答案:

答案 0 :(得分:5)

如果您希望在整个网站中重复使用,您可能最好创建一个上下文处理器,该处理器将始终使用包含查看次数最多的类别的变量填充模板上下文

from django.core.cache import get_cache

CACHE_KEY_MOST_VIEWED_CATEGORIES = 'most_viewed_categories'
cache = get_cache('default')

def _get_most_viewed_categories():
    raise NotImplemented("Haven't figured out how to collect the value and cache it")

def most_viewed_categories(request):
    '''Provides the most viewed categories for every template context.'''

    return {
        'most_viewed_categories': cache.get(CACHE_KEY_MOST_VIEWED_CATEGORIES, 
                                            _get_most_viewed_categories)
    }

但无论如何,要在数据库中缓存值,您需要获取缓存并使用cache.setcache.get来存储和检索值。