Hvordan til at cache Django Resten Ramme API-opkald?

Jeg er Memcached som backend til min django app. Denne kode virker fint i normal django forespørgsel:

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

Men det virker ikke, når det bruges med django-resten-ramme api-kald:

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

Jeg er ved at prøve DRF-udvidelser, som giver caching funktionalitet:

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

men bygge status på github er i øjeblikket ved at sige “byg ikke”.

Min app er meget læse-tungt på api-kald. Er der en måde at cache disse opkald?

Tak.

Har du dekorere metode med “@cache_response()” ?
Hej. @cache_response er fra DRF-extensions, som jeg ikke forsøge at gennemføre det endnu, fordi bygge status siger “byg ikke” på deres github side : github.com/chibisov/drf-extensions
Du indse, at den opfattelse, du har indsat ikke ringe til cachen ?
Ja jeg ændre værdier i admin og genindlæse drf web-tilgængeligt api. Værdier altid ændret sig, efter opdatering. Standard-timeout bør være 5 minutter, hvis min hukommelse ikke svigter
Men listen over produkter på hjemmesiden ændrer sig ikke, hvis opdateres indenfor 5 min interval. Så jeg antager, cache arbejder(til hjemmesiden)

OriginalForfatteren Kakyoin | 2016-07-12

3 svar

  1. 32

    Ok, så for at bruge caching for din queryset:

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

    Du ville sikkert gerne sætte et timeout på cache sæt selv (som 60 sekunder):

    cache.set(cache_key, result, 60)

    Hvis du ønsker at cache det hele:

    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)
    Tak! Virker perfekt.
    Når jeg forsøger det nøjagtigt, som de vises, får jeg en fejl 'ShopsList' object has no attribute 'method'. Nogen idéer?
    Det er et andet spørgsmål der ikke kan besvares inden for den aktuelle tråd.
    samme fejl, når jeg prøver dette svar.
    ja @eugene, så ring cache_page på udsigt i URL Router mønstre cache_page(YourView.as_view())

    OriginalForfatteren Linovia

  2. 1

    Jeg har lige gennemført denne til at bruge på min serializers

    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

    så jeg tilsidesætte to_representation metode på min serializers, så det caches føljeton output per eksempel.

    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)

    OriginalForfatteren Marco Silva

  3. 0

    Prøv denne app 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)

    OriginalForfatteren naren

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *