mirror of
https://gitlab.science.ru.nl/technicie/MarietjeDjango.git
synced 2025-12-09 18:52:23 +01:00
Add caching for song searching
This commit is contained in:
@ -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,
|
||||
|
||||
@ -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'
|
||||
|
||||
@ -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():
|
||||
|
||||
@ -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
|
||||
|
||||
Reference in New Issue
Block a user