From c749508b8970fb42a65c4f0ef60801685affa190 Mon Sep 17 00:00:00 2001 From: Fredrik Jonsson <frjo@xdeb.org> Date: Wed, 1 May 2019 17:01:12 +0200 Subject: [PATCH] Implement cache for news feed. --- opentech/public/news/feeds.py | 20 ++++++++++++++++++-- opentech/settings/base.py | 3 +++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/opentech/public/news/feeds.py b/opentech/public/news/feeds.py index ae79a1ee6..b8cb442c8 100644 --- a/opentech/public/news/feeds.py +++ b/opentech/public/news/feeds.py @@ -1,4 +1,6 @@ +from django.conf import settings from django.contrib.syndication.views import Feed +from django.core.cache import cache from django.db.models.functions import Coalesce from django.http import Http404 @@ -14,7 +16,21 @@ class NewsFeed(Feed): except Site.DoesNotExist: raise Http404 self.news_feed_settings = NewsFeedSettings.for_site(site=self.site) - return super().__call__(request, *args, **kwargs) + + cache_key = self.get_cache_key(*args, **kwargs) + response = cache.get(cache_key) + + if response is None: + response = super().__call__(request, *args, **kwargs) + cache.set(cache_key, response, settings.FEED_CACHE_TIMEOUT) + + return response + + def get_cache_key(self, *args, **kwargs): + tag = '' + for key, value in kwargs.items(): + tag += f"-{key}-{value}" + return f"{self.__class__.__module__}{tag}" def title(self): return self.news_feed_settings.news_title @@ -56,7 +72,7 @@ class NewsTypeFeed(NewsFeed): def link(self, obj): news_index = NewsIndex.objects.live().public().first() if news_index: - return news_index.full_url + '?news_type={}'.format(obj.id) + return f"{news_index.full_url}?news_type={obj.id}" return self.site.root_url def items(self, obj): diff --git a/opentech/settings/base.py b/opentech/settings/base.py index 3cd070b03..bef78cd42 100644 --- a/opentech/settings/base.py +++ b/opentech/settings/base.py @@ -214,6 +214,9 @@ except ValueError: # Set wagtail cache timeout (automatic cache refresh). WAGTAIL_CACHE_TIMEOUT = CACHE_CONTROL_MAX_AGE +# Set feed cache timeout (automatic cache refresh). +FEED_CACHE_TIMEOUT = 600 + if 'REDIS_URL' in env: CACHES = { "default": { -- GitLab