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

0 投票
1 回答
6902 浏览
提问于 2025-04-17 07:58

在我的网站上,我想在侧边栏展示用户最常查看的产品类别,这个功能会在多个页面上使用。

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

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>

不过,我希望能每隔两天计算一次最常查看的类别,而不是在每次查看时都计算。

我知道可以缓存视图,但这更像是缓存一个变量。有没有办法在Django服务器上缓存这个变量,并且只在过了一段时间后再更新它?该怎么做呢?

谢谢

1 个回答

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.set 来存储这个值,使用 cache.get 来取出这个值。

撰写回答