API Django с кешем Redis не обновляется сразу после запросов POST/PUT/DELETEPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 API Django с кешем Redis не обновляется сразу после запросов POST/PUT/DELETE

Сообщение Anonymous »

Я разрабатываю REST API Django, используя Django, Redis и SQLite. Цель — кэшировать данные для запросов GET для повышения производительности, используя Redis в качестве уровня кэширования.
Проблема:

Когда я создаю, обновляю или удаляю категорию или экземплярах продукта, изменения отражаются в базе данных (как видно на странице администрирования Django), но не сразу в последующих запросах GET. Ответы GET отражают изменения только после перезапуска сервера. Однако создание новой категории с тем же именем невозможно, что указывает на то, что API по-прежнему может читать существующие данные из базы данных.
app/views.py
from django.shortcuts import render
from django.core.cache import cache
from rest_framework import viewsets, status
from rest_framework.response import Response
from rest_framework.decorators import action
from .models import Category, Product
from .serializers import CategorySerializer, ProductSerializer
from django.conf import settings

CACHE_TTL = getattr(settings, 'CACHE_TTL', 5)

class CategoryViewSet(viewsets.ModelViewSet):
queryset = Category.objects.all()
serializer_class = CategorySerializer
cache_key = 'store:categories'

def list(self, request, *args, **kwargs):
data = cache.get(self.cache_key)
print("Cache GET for"+self.cache_key)

if not data:
# Serialize the queryset to JSON before caching
data = list(self.queryset);
cache.set(self.cache_key, data, CACHE_TTL)
print(f"Cache set for"+self.cache_key)

print('Cache retrieved')
serializer = self.get_serializer(data, many=True)
return Response(serializer.data)

def create(self, request, *args, **kwargs):
cache.delete('store:categories')
print(f"Cache deleted for"+self.cache_key)
return super().create(request, *args, **kwargs)

def update(self, request, *args, **kwargs):
cache.delete('store:categories')
print(f"Cache deleted for"+self.cache_key)
return super().update(request, *args, **kwargs)

def destroy(self, request, *args, **kwargs):
cache.delete('store:categories')
print(f"Cache deleted for"+self.cache_key)
return super().destroy(request, *args, **kwargs)

class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer

def list(self, request, *args, **kwargs):
cache_key = 'store:products'
data = cache.get(cache_key)

if not data:
data = list(self.queryset)
cache.set(cache_key, data, CACHE_TTL)

serializer = self.get_serializer(data, many=True)
return Response(serializer.data)

def create(self, request, *args, **kwargs):
cache.delete('store:products')
return super().create(request, *args, **kwargs)

def update(self, request, *args, **kwargs):
cache.delete('store:products')
return super().update(request, *args, **kwargs)

def destroy(self, request, *args, **kwargs):
cache.delete('store:products')
return super().destroy(request, *args, **kwargs)


app/serializers.py
from rest_framework import serializers
from .models import Category, Product

class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = '__all__'

class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = '__all__'

Вот результаты отладки для категорий POST и GET:
System check identified no issues (0 silenced).
November 19, 2024 - 17:07:00
Django version 5.1.3, using settings 'storeapi.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

Cache GET forstore:categories
Cache set forstore:categories
Cache retrieved
[19/Nov/2024 17:07:03] "GET /api/categories/ HTTP/1.1" 200 296
Cache deleted forstore:categories
[19/Nov/2024 17:07:16] "POST /api/categories/ HTTP/1.1" 201 42
Cache GET forstore:categories
Cache set forstore:categories
Cache retrieved
[19/Nov/2024 17:07:20] "GET /api/categories/ HTTP/1.1" 200 296


Подробнее здесь: https://stackoverflow.com/questions/792 ... lete-reque
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»