Каков наилучший подход к использованию кэша в Django?
<from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
class DemoView(APIView):
def get(self, request):
user_id = request.query_params.get('user_id', None)
num = MyModel.objects.get(id=user_id).num
for i in range(num):
num = num*i + 1. # In real work, much more complicated.
return Response({'success': True, 'square':num}, status=status.HTTP_200_OK)
def post(self, request):
user_id = request.data.get('user_id', None)
num = request.data.get('num', None)
num_from_my_model = MyModel.objects.get(id=user_id).num
if num == num_from_my_model:
MyModel.objects.filter(id=user_id).update(num=num)
return Response({'success': True}, status=status.HTTP_200_OK)
У меня есть GET и
(1) Прежде всего, я создаю базу данных MyCache, чтобы посмотреть, изменился ли num в методе POST.
(2) Если изменить, MyCache переведет параметр cache_changed в значение True (по умолчанию False).
(3) В методе GET я проверю, является ли cache_changed истиной. Если True, я сохраню результат в кэш. Если False, то я получу результат из кэша.
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
from django.core.cache import cache
class DemoView(APIView):
@method_decorator(cache_page(60))
def get(self, request):
user_id = request.query_params.get('user_id', None)
cache_changed = MyCache.objects.get(id=user_id).cache_changed
if cache_changed:
num = MyModel.objects.get(id=user_id).num
for i in range(num):
num = num*i + 1.
cache.set('result', num)
else:
num = cache.get('result')
return Response({'success': True, 'result':num}, status=status.HTTP_200_OK)
def post(self, request):
user_id = request.data.get('user_id', None)
num = request.data.get('num', None)
num_from_my_model = MyModel.objects.get(id=user_id).num
if num == num_from_my_model:
MyModel.objects.filter(id=user_id).update(num=num)
MyCache.objects.filter(id=user_id).update(cache_changed=True)
return Response({'success': True}, status=status.HTTP_200_OK)
Насколько я понимаю, если послано два или более GET запроса, то второй или более поздний запрос может быть удовлетворен быстрее. Поскольку я очень новичок в кэшировании, я не знаю, является ли это лучшим подходом для такого рода задач. Я буду очень рад, если кто-нибудь сможет дать мне совет.