Branch: refs/heads/master Author: Enrico Tröger enrico.troeger@uvena.de Committer: Enrico Tröger enrico.troeger@uvena.de Date: Wed, 01 May 2019 13:07:32 UTC Commit: dfea03b153ee3910caaf37ebffcdd266ee0d77aa https://github.com/geany/www.geany.org/commit/dfea03b153ee3910caaf37ebffcdd2...
Log Message: ----------- Cache snippet list
And invalidate the cached contents on save and delete.
Modified Paths: -------------- pastebin/models.py pastebin/urls.py pastebin/views.py
Modified: pastebin/models.py 11 lines changed, 11 insertions(+), 0 deletions(-) =================================================================== @@ -17,6 +17,7 @@ import re import time
+from django.core.cache import cache from django.db import models from django.urls import reverse from django.utils import timezone @@ -26,6 +27,8 @@
CHARS = 'abcdefghijkmnopqrstuvwwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ1234567890' +CACHE_KEY_SNIPPET_LIST_NO_CONTENT = 'snippet_list_no_content' +CACHE_KEY_SNIPPET_LIST_FULL = 'snippet_list_full'
# ---------------------------------------------------------------------- @@ -105,6 +108,14 @@ def save(self, *args, **kwargs): # pylint: disable=arguments-differ
self.content_highlighted = self.content super(Snippet, self).save(*args, **kwargs) + # invalidate cache + cache.delete_many([CACHE_KEY_SNIPPET_LIST_NO_CONTENT, CACHE_KEY_SNIPPET_LIST_FULL]) + + # ---------------------------------------------------------------------- + def delete(self, *args, **kwargs): # pylint: disable=arguments-differ + super(Snippet, self).delete(*args, **kwargs) + # invalidate cache + cache.delete_many([CACHE_KEY_SNIPPET_LIST_NO_CONTENT, CACHE_KEY_SNIPPET_LIST_FULL])
# ---------------------------------------------------------------------- def get_absolute_url(self):
Modified: pastebin/urls.py 2 lines changed, 1 insertions(+), 1 deletions(-) =================================================================== @@ -40,7 +40,7 @@ url(r'^api/$', never_cache(SnippetAPIView.as_view()), name='snippet_api'),
url(r'^$', never_cache(SnippetNewView.as_view()), name='snippet_new'), - url(r'^latest/$', LatestSnippetsView.as_view(), name='snippet_list'), + url(r'^latest/$', never_cache(LatestSnippetsView.as_view()), name='snippet_list'), url( r'^(?P<snippet_id>[a-zA-Z0-9]+)/$', SnippetDetailView.as_view(),
Modified: pastebin/views.py 30 lines changed, 20 insertions(+), 10 deletions(-) =================================================================== @@ -14,6 +14,7 @@
from django.conf import settings from django.contrib.sites.models import Site +from django.core.cache import cache from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseRedirect from django.shortcuts import get_object_or_404, render @@ -26,25 +27,34 @@ from django.views.generic.base import TemplateView, View from honeypot.decorators import check_honeypot
+from geany.decorators import CACHE_TIMEOUT_24HOURS from pastebin.api.create import CreateSnippetApiController, SnippetValidationError from pastebin.forms import SnippetForm -from pastebin.models import Snippet +from pastebin.models import CACHE_KEY_SNIPPET_LIST_FULL, CACHE_KEY_SNIPPET_LIST_NO_CONTENT, Snippet
# ---------------------------------------------------------------------- def _get_snippet_list(no_content=False): + if no_content: + queryset = Snippet.objects.defer('content', 'content_highlighted') + cache_key = CACHE_KEY_SNIPPET_LIST_NO_CONTENT + else: + queryset = Snippet.objects.all() + cache_key = CACHE_KEY_SNIPPET_LIST_FULL + + # snippet list in cache? + snippet_list = cache.get(cache_key, None) + if snippet_list is not None: + return snippet_list + + # nothing in cache, fetch snippets from the database try: max_snippets = getattr(settings, 'MAX_SNIPPETS_PER_USER', 10) - # TODO cache the result set and clear it upon Snippet.save() - if no_content: - queryset = Snippet.objects.defer('content', 'content_highlighted') - else: - queryset = Snippet.objects.all() - - snippet_list_ = queryset[:max_snippets] + snippet_list = list(queryset[:max_snippets]) + cache.set(cache_key, snippet_list, CACHE_TIMEOUT_24HOURS) except ValueError: - snippet_list_ = list() - return snippet_list_ + snippet_list = list() + return snippet_list
class SnippetNewView(View):
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).