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
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,