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,

View File

@ -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'

View File

@ -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():

View File

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