Move caching to memcached
This commit is contained in:
parent
28e79b9362
commit
5d4ef292d6
|
@ -11,6 +11,7 @@ from reportlab.pdfgen import canvas
|
||||||
from reportlab.lib.pagesizes import letter
|
from reportlab.lib.pagesizes import letter
|
||||||
|
|
||||||
from django.db.models import Sum
|
from django.db.models import Sum
|
||||||
|
from django.core.cache import cache
|
||||||
|
|
||||||
from . import models, serializers
|
from . import models, serializers
|
||||||
try:
|
try:
|
||||||
|
@ -126,17 +127,18 @@ def tally_membership_months(member, fake_date=None):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
search_strings = {}
|
|
||||||
def gen_search_strings():
|
def gen_search_strings():
|
||||||
'''
|
'''
|
||||||
Generate a cache dict of names to member ids for rapid string matching
|
Generate a cache dict of names to member ids for rapid string matching
|
||||||
'''
|
'''
|
||||||
|
search_strings = {}
|
||||||
for m in models.Member.objects.all():
|
for m in models.Member.objects.all():
|
||||||
string = '{} {}'.format(
|
string = '{} {}'.format(
|
||||||
m.preferred_name,
|
m.preferred_name,
|
||||||
m.last_name,
|
m.last_name,
|
||||||
).lower()
|
).lower()
|
||||||
search_strings[string] = m.id
|
search_strings[string] = m.id
|
||||||
|
cache.set('search_strings', search_strings)
|
||||||
|
|
||||||
|
|
||||||
LARGE_SIZE = 1080
|
LARGE_SIZE = 1080
|
||||||
|
|
|
@ -3,6 +3,7 @@ from django.shortcuts import get_object_or_404
|
||||||
from django.db.models import Max
|
from django.db.models import Max
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from django.core.files.base import File
|
from django.core.files.base import File
|
||||||
|
from django.core.cache import cache
|
||||||
from rest_framework import viewsets, views, mixins, generics, exceptions
|
from rest_framework import viewsets, views, mixins, generics, exceptions
|
||||||
from rest_framework.decorators import action
|
from rest_framework.decorators import action
|
||||||
from rest_framework.permissions import BasePermission, IsAuthenticated, SAFE_METHODS
|
from rest_framework.permissions import BasePermission, IsAuthenticated, SAFE_METHODS
|
||||||
|
@ -50,11 +51,13 @@ class SearchViewSet(Base, Retrieve):
|
||||||
queryset = models.Member.objects.all()
|
queryset = models.Member.objects.all()
|
||||||
search = self.request.data.get('q', '').lower()
|
search = self.request.data.get('q', '').lower()
|
||||||
|
|
||||||
if not utils.search_strings:
|
if not cache.touch('search_strings'):
|
||||||
utils.gen_search_strings() # init cache
|
utils.gen_search_strings() # init cache
|
||||||
|
|
||||||
|
search_strings = cache.get('search_strings', {})
|
||||||
|
|
||||||
if len(search):
|
if len(search):
|
||||||
choices = utils.search_strings.keys()
|
choices = search_strings.keys()
|
||||||
|
|
||||||
# get exact starts with matches
|
# get exact starts with matches
|
||||||
results = [x for x in choices if x.startswith(search)]
|
results = [x for x in choices if x.startswith(search)]
|
||||||
|
@ -69,7 +72,7 @@ class SearchViewSet(Base, Retrieve):
|
||||||
# remove dupes, truncate list
|
# remove dupes, truncate list
|
||||||
results = list(OrderedDict.fromkeys(results))[:NUM_SEARCH_RESULTS]
|
results = list(OrderedDict.fromkeys(results))[:NUM_SEARCH_RESULTS]
|
||||||
|
|
||||||
result_ids = [utils.search_strings[x] for x in results]
|
result_ids = [search_strings[x] for x in results]
|
||||||
result_objects = [queryset.get(id=x) for x in result_ids]
|
result_objects = [queryset.get(id=x) for x in result_ids]
|
||||||
|
|
||||||
queryset = result_objects
|
queryset = result_objects
|
||||||
|
@ -308,6 +311,7 @@ class IpnView(views.APIView):
|
||||||
return Response(200)
|
return Response(200)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class RegistrationView(RegisterView):
|
class RegistrationView(RegisterView):
|
||||||
serializer_class = serializers.RegistrationSerializer
|
serializer_class = serializers.RegistrationSerializer
|
||||||
|
|
||||||
|
|
|
@ -117,6 +117,14 @@ DATABASES = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CACHES = {
|
||||||
|
'default': {
|
||||||
|
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
|
||||||
|
'LOCATION': '127.0.0.1:11211',
|
||||||
|
'TIMEOUT': None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# Password validation
|
# Password validation
|
||||||
# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators
|
# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators
|
||||||
|
|
|
@ -9,8 +9,11 @@ Install dependencies:
|
||||||
|
|
||||||
.. sourcecode:: bash
|
.. sourcecode:: bash
|
||||||
|
|
||||||
# Python:
|
# Misc:
|
||||||
$ sudo apt update
|
$ sudo apt update
|
||||||
|
$ sudo apt install memcached
|
||||||
|
|
||||||
|
# Python:
|
||||||
$ sudo apt install python3 python3-pip python-virtualenv python3-virtualenv
|
$ sudo apt install python3 python3-pip python-virtualenv python3-virtualenv
|
||||||
|
|
||||||
# Yarn / nodejs:
|
# Yarn / nodejs:
|
||||||
|
|
|
@ -28,6 +28,7 @@ pyparsing==2.4.6
|
||||||
PyPDF2==1.26.0
|
PyPDF2==1.26.0
|
||||||
python-dateutil==2.8.1
|
python-dateutil==2.8.1
|
||||||
python-Levenshtein==0.12.0
|
python-Levenshtein==0.12.0
|
||||||
|
python-memcached==1.59
|
||||||
python3-openid==3.1.0
|
python3-openid==3.1.0
|
||||||
pytz==2019.3
|
pytz==2019.3
|
||||||
reportlab==3.5.34
|
reportlab==3.5.34
|
||||||
|
|
Loading…
Reference in New Issue
Block a user