Django中的全局变量/变量缓存
在我的网站上,我想在侧边栏展示用户最常查看的产品类别,这个功能会在多个页面上使用。
所以在每个不同的视图中,我有:
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
来取出这个值。