Глобальная переменная / Кэширование переменных в 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>
Однако я хотел бы вычислять значение most_viewed_categories только один раз каждые 2 дня или около того, вместо того, чтобы вычислять его в каждом представлении.
Я знаю, что представления могут быть кэшированы, но это скорее переменное кэширование. Можно ли кешировать эту переменную где-то на сервере Django и обновлять ее только после этого периода времени? Как можно это сделать?
Спасибо
1 ответ
Если вы хотите повторно использовать его по всему сайту, вам лучше всего создать контекстный процессор, который будет всегда заполнять контекст шаблона переменной, содержащей наиболее просматриваемые категории.
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
сохранить и получить значение.