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

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

Issue:
. Когда я создаю, обновляю или удаляю экземпляры Category или Product, изменения отражаются в базе данных (как видно на странице администратора 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
Вернуться на верх