Я разрабатываю 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
API Django с кешем Redis не обновляется сразу после запросов POST/PUT/DELETE ⇐ Python
Программы на Python
1732012745
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79202793/django-api-with-redis-cache-not-updating-immediately-after-post-put-delete-reque[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия