При использовании моего Django REST API с использованием 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 ... e-requests
Почему мой код не обновляется сразу после запросов POST/PUT/DELETE? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
API Django с кешем Redis не обновляется сразу после запросов POST/PUT/DELETE
Anonymous » » в форуме Python - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-
-
-
API Django с кешем Redis не обновляется сразу после запросов POST/PUT/DELETE
Anonymous » » в форуме Python - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Маршруты API Laravel не работают для запросов POST, PUT, PATCH, DELETE на сервере
Anonymous » » в форуме Php - 0 Ответы
- 52 Просмотры
-
Последнее сообщение Anonymous
-