Add caching for song searching

This commit is contained in:
Daan Sprenkels
2018-08-16 23:32:20 +02:00
parent 641e5cb908
commit 2a340ef22c
4 changed files with 36 additions and 25 deletions

View File

@ -3,12 +3,14 @@ from functools import wraps
import django.middleware.csrf as csrf import django.middleware.csrf as csrf
from django.contrib.auth import authenticate, login from django.contrib.auth import authenticate, login
from django.core.cache import caches
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.db import transaction from django.db import transaction
from django.db.models import Q, Sum, Value from django.db.models import Q, Sum, Value
from django.db.models.functions import Coalesce from django.db.models.functions import Coalesce
from django.http import JsonResponse, HttpResponseForbidden from django.http import JsonResponse, HttpResponseForbidden
from django.shortcuts import get_object_or_404 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.views.decorators.http import require_http_methods
from django.conf import settings from django.conf import settings
from mutagen import File from mutagen import File
@ -80,35 +82,39 @@ def songs(request):
try: try:
pagesize = int(request.POST.get('pagesize')) pagesize = int(request.POST.get('pagesize'))
except: except:
pagesize = 10 pagesize = 50
if not pagesize or pagesize < 10: if not pagesize or pagesize < 50:
pagesize = 10 pagesize = 50
try: try:
page = int(request.POST.get('page')) page = int(request.POST.get('page'))
except: except:
page = 1 page = 1
queries = [Q(deleted=False)] def search_songs():
queries.extend([Q(Q(artist__icontains=word) | Q(title__icontains=word)) for word in request.POST.get('all', '').split()]) queries = [Q(deleted=False)]
queries.extend([Q(user__name__icontains=word) for word in request.POST.get('uploader', '').split()]) 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() filter_query = queries.pop()
for query in queries: for query in queries:
filter_query &= query filter_query &= query
songs_query = Song.objects.filter(filter_query).order_by('artist', 'title').select_related('user') songs_query = Song.objects.filter(filter_query).order_by('artist', 'title').select_related('user')
paginator = Paginator(songs_query, pagesize) paginator = Paginator(songs_query, pagesize)
try: try:
songs = paginator.page(page) songs = paginator.page(page)
except PageNotAnInteger: except PageNotAnInteger:
songs = paginator.page(1) songs = paginator.page(1)
except EmptyPage: except EmptyPage:
songs = paginator.page(paginator.num_pages) 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({ return JsonResponse({
'per_page': pagesize, 'per_page': pagesize,

View File

@ -94,8 +94,13 @@ PASSWORD_HASHERS = [
CACHES = { CACHES = {
'default': { 'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', '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' AUTH_USER_MODEL = 'marietje.User'

View File

@ -1,6 +1,6 @@
from datetime import datetime, timedelta from datetime import datetime, timedelta
from django.core.cache import cache from django.core.cache import caches
from django.conf import settings from django.conf import settings
from django.db.models import Count, Q from django.db.models import Count, Q
from django.shortcuts import render from django.shortcuts import render
@ -12,8 +12,8 @@ from songs.models import Song
def recache_stats(): def recache_stats():
new_stats = compute_stats() new_stats = compute_stats()
cache.delete('stats') caches['default'].delete('stats')
cache.set('stats', new_stats, 7200) caches['default'].set('stats', new_stats, 7200)
return new_stats return new_stats
def compute_stats(): def compute_stats():

View File

@ -1,11 +1,11 @@
from datetime import datetime, timedelta from datetime import datetime, timedelta
from django.core.cache import cache from django.core.cache import caches
from django.shortcuts import render from django.shortcuts import render
def stats(request): def stats(request):
stats = cache.get('stats') stats = caches['default'].get('stats')
status = 503 status = 503
current_age = None current_age = None
current_age_text = None current_age_text = None