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

0 python django caching django-cache django-caching

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

所以在每个不同的观点中,我都有:

variables = RequestContext(request, {
   (...)
   'most_viewed_cats': calculate_most_viewed_categories()
}
Run Code Online (Sandbox Code Playgroud)

并在各种模板中

{% include "list_most_viewed_categories" %}
Run Code Online (Sandbox Code Playgroud)

在那一个:

<ul>
{% for cat in most_viewed_cats %}
    {{ cat.name }}
{% empty %}
    </ul>No categories to show.<ul>
{% endfor %} 
</ul>
Run Code Online (Sandbox Code Playgroud)

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

我知道可以缓存视图,但这更像是一种变量缓存。是否可以将这个变量缓存在 Django 服务器的某个地方,并仅在这段时间之后更新它?怎么做呢?

谢谢

Fil*_*vić 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)
    }
Run Code Online (Sandbox Code Playgroud)

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