diff --git a/marietje/api/views.py b/marietje/api/views.py index d750765..36bbe8b 100644 --- a/marietje/api/views.py +++ b/marietje/api/views.py @@ -3,12 +3,14 @@ from functools import wraps import django.middleware.csrf as csrf from django.contrib.auth import authenticate, login +from django.core.cache import caches from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.db import transaction from django.db.models import Q, Sum, Value from django.db.models.functions import Coalesce from django.http import JsonResponse, HttpResponseForbidden from django.shortcuts import get_object_or_404 +from django.views.decorators.cache import cache_page from django.views.decorators.http import require_http_methods from django.conf import settings from mutagen import File @@ -80,35 +82,39 @@ def songs(request): try: pagesize = int(request.POST.get('pagesize')) except: - pagesize = 10 + pagesize = 50 - if not pagesize or pagesize < 10: - pagesize = 10 + if not pagesize or pagesize < 50: + pagesize = 50 try: page = int(request.POST.get('page')) except: page = 1 - queries = [Q(deleted=False)] - queries.extend([Q(Q(artist__icontains=word) | Q(title__icontains=word)) for word in request.POST.get('all', '').split()]) - queries.extend([Q(user__name__icontains=word) for word in request.POST.get('uploader', '').split()]) + def search_songs(): + queries = [Q(deleted=False)] + queries.extend([Q(Q(artist__icontains=word) | Q(title__icontains=word)) for word in request.POST.get('all', '').split()]) + queries.extend([Q(user__name__icontains=word) for word in request.POST.get('uploader', '').split()]) - filter_query = queries.pop() - for query in queries: - filter_query &= query + filter_query = queries.pop() + for query in queries: + filter_query &= query - songs_query = Song.objects.filter(filter_query).order_by('artist', 'title').select_related('user') - paginator = Paginator(songs_query, pagesize) + songs_query = Song.objects.filter(filter_query).order_by('artist', 'title').select_related('user') + paginator = Paginator(songs_query, pagesize) - try: - songs = paginator.page(page) - except PageNotAnInteger: - songs = paginator.page(1) - except EmptyPage: - songs = paginator.page(paginator.num_pages) + try: + songs = paginator.page(page) + except PageNotAnInteger: + songs = paginator.page(1) + except EmptyPage: + songs = paginator.page(paginator.num_pages) - songs_dict = [song_to_dict(song, user=True) for song in songs.object_list] + return [song_to_dict(song, user=True) for song in songs.object_list], paginator + + cache_key = '|'.join(request.POST.get(k) for k in ('all', 'uploader', 'pagesize', 'page')) + songs_dict, paginator = caches['song_search'].get_or_set(cache_key, search_songs, 60*60*2) return JsonResponse({ 'per_page': pagesize, diff --git a/marietje/marietje/settings.py b/marietje/marietje/settings.py index 64fb370..255071a 100644 --- a/marietje/marietje/settings.py +++ b/marietje/marietje/settings.py @@ -94,8 +94,13 @@ PASSWORD_HASHERS = [ CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', - 'LOCATION': '/var/tmp/MarietjeDjango_cache', - } + 'LOCATION': '/var/tmp/MarietjeDjango_cache/default', + }, + 'song_search': { + 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', + 'LOCATION': '/var/tmp/MarietjeDjango_cache/song_search', + 'OPTIONS': { 'MAX_ENTRIES': 1000 }, + }, } AUTH_USER_MODEL = 'marietje.User' diff --git a/marietje/stats/utils.py b/marietje/stats/utils.py index 750bff3..cf91340 100644 --- a/marietje/stats/utils.py +++ b/marietje/stats/utils.py @@ -1,6 +1,6 @@ from datetime import datetime, timedelta -from django.core.cache import cache +from django.core.cache import caches from django.conf import settings from django.db.models import Count, Q from django.shortcuts import render @@ -12,8 +12,8 @@ from songs.models import Song def recache_stats(): new_stats = compute_stats() - cache.delete('stats') - cache.set('stats', new_stats, 7200) + caches['default'].delete('stats') + caches['default'].set('stats', new_stats, 7200) return new_stats def compute_stats(): diff --git a/marietje/stats/views.py b/marietje/stats/views.py index 16adcc5..7937ecc 100644 --- a/marietje/stats/views.py +++ b/marietje/stats/views.py @@ -1,11 +1,11 @@ from datetime import datetime, timedelta -from django.core.cache import cache +from django.core.cache import caches from django.shortcuts import render def stats(request): - stats = cache.get('stats') + stats = caches['default'].get('stats') status = 503 current_age = None current_age_text = None