with restful instalar framework filters español python django caching django-rest-framework memcached

python - restful - django rest framework with django 2



¿Cómo almacenar en caché las llamadas a la API de Django Rest Framework? (3)

Acabo de implementar esto para usar en mis serializadores.

def cache_me(cache): def true_decorator(f): @wraps(f) def wrapper(*args, **kwargs): instance = args[1] cache_key = ''%s.%s'' % (instance.facility, instance.id) logger.debug(''%s cache_key: %s'' % (cache, cache_key)) try: data = caches[cache].get(cache_key) if data is not None: return data except: pass logger.info(''did not cache'') data = f(*args, **kwargs) try: caches[cache].set(cache_key, data) except: pass return data return wrapper return true_decorator

Luego anulo el método to_representation en mis serializadores, por lo que almacena en caché la salida serializada por instancia.

class MyModelSerializer(serializers.ModelSerializer): class Meta: model = MyModel exclude = (''is_deleted'', ''facility'',) @cache_me(''mymodel'') def to_representation(self, instance): return super(MyModelSerializer, self).to_representation(instance)

Estoy usando Memcached como backend para mi aplicación django. Este código funciona bien en la consulta normal de django:

def get_myobj(): cache_key = ''mykey'' result = cache.get(cache_key, None) if not result: result = Product.objects.all().filter(draft=False) cache.set(cache_key, result) return result

Pero no funciona cuando se usa con las llamadas de la API de django-rest-framework:

class ProductListAPIView(generics.ListAPIView): def get_queryset(self): product_list = Product.objects.all() return product_list serializer_class = ProductSerializer

Estoy a punto de probar las extensiones DRF que proporcionan funcionalidad de almacenamiento en caché:

https://github.com/chibisov/drf-extensions

pero el estado de compilación en github actualmente dice "falla de compilación".

Mi aplicación es muy leída en las llamadas de api. ¿Hay una manera de almacenar estas llamadas?

Gracias.


Ok, entonces, para usar el almacenamiento en caché para su queryset:

class ProductListAPIView(generics.ListAPIView): def get_queryset(self): return get_myobj() serializer_class = ProductSerializer

Es probable que desees establecer un tiempo de espera en el conjunto de caché (como 60 segundos):

cache.set(cache_key, result, 60)

Si desea almacenar en caché toda la vista:

from django.utils.decorators import method_decorator from django.views.decorators.cache import cache_page class ProductListAPIView(generics.ListAPIView): serializer_class = ProductSerializer @method_decorator(cache_page(60)) def dispatch(self, *args, **kwargs): return super(ProductListAPIView, self).dispatch(*args, **kwargs)


Pruebe esta aplicación Django https://github.com/Onyo/django-rest-framework-cache

from rest_framework import serializers # You must import the CachedSerializerMixin and cache_registry from rest_framework_cache.serializers import CachedSerializerMixin from rest_framework_cache.registry import cache_registry from .models import Comment class CommentSerializer(serializers.ModelSerializer, CachedSerializerMixin): class Meta: model = Comment cache_registry.register(CommentSerializer)