2016-07-20 4 views
2

캐싱을 위해 Django Rest Framework와 DRF-Extensions를 사용하고 있습니다.drf-extensions CacheResponseMixin 캐싱이 왜 아닌가요?

사용자 정의 list()retrieve() 메소드가있는 뷰 세트가 있습니다. 메서드에 @cache_response() 데코레이터를 넣을 수 있으며 캐시에 성공적으로 도달하고 설정합니다. 그러나 CacheResponseMixin을 사용하려고하면 아무 일도 일어나지 않습니다.

작품 :

class SeriesViewSet(viewsets.ReadOnlyModelViewSet): 
    serializer_class = SeriesSerializer 

    def get_queryset(self): 
     series_type = EntityType.objects.get(name='series') 
     return Container.objects.filter(type=series_type) 

    @cache_response() 
    def list(self, request): 
     series = self.get_queryset() 
     serializer = SeriesSerializer(series, many=True) 
     return Response(serializer.data) 

    @cache_response() 
    def retrieve(self, request, pk=None): 
     name = pk 
     series = self.get_queryset() 
     show = series.get(data__title=name) 
     serializer = SeriesSerializer(show) 
     return Response(serializer.data) 

은 작동하지 않습니다

class SeriesViewSet(CacheResponseMixin, viewsets.ReadOnlyModelViewSet): 
    serializer_class = SeriesSerializer 

    def get_queryset(self): 
     series_type = EntityType.objects.get(name='series') 
     return Container.objects.filter(type=series_type) 

    def list(self, request): 
     series = self.get_queryset() 
     serializer = SeriesSerializer(series, many=True) 
     return Response(serializer.data) 

    def retrieve(self, request, pk=None): 
     name = pk 
     series = self.get_queryset() 
     show = series.get(data__title=name) 
     serializer = SeriesSerializer(show) 
     return Response(serializer.data) 

오류가 주어지지, 내 캐시 항목이 간단하게 생성되지 않습니다.

+0

예를 들어. 목록 방법? 아마도 CacheResponseMixin에서 캐시 배치에 문제가있을 수 있습니다. – trinchet

답변

4

소스를 읽고 (문서와 함께) 믹스 인 클래스는 기본 목록 및 검색 기능을 사용할 때만 사용됩니다. 출처를 확인하십시오 :

# -*- coding: utf-8 -*- 
from rest_framework_extensions.cache.decorators import cache_response 
from rest_framework_extensions.settings import extensions_api_settings 


class BaseCacheResponseMixin(object): 
    # todo: test me. Create generic test like 
    # test_cache_reponse(view_instance, method, should_rebuild_after_method_evaluation) 
    object_cache_key_func = extensions_api_settings.DEFAULT_OBJECT_CACHE_KEY_FUNC 
    list_cache_key_func = extensions_api_settings.DEFAULT_LIST_CACHE_KEY_FUNC 


class ListCacheResponseMixin(BaseCacheResponseMixin): 
    @cache_response(key_func='list_cache_key_func') 
    def list(self, request, *args, **kwargs): 
     return super(ListCacheResponseMixin, self).list(request, *args, **kwargs) 


class RetrieveCacheResponseMixin(BaseCacheResponseMixin): 
    @cache_response(key_func='object_cache_key_func') 
    def retrieve(self, request, *args, **kwargs): 
     return super(RetrieveCacheResponseMixin, self).retrieve(request, *args, **kwargs) 


class CacheResponseMixin(RetrieveCacheResponseMixin, 
         ListCacheResponseMixin): 
    pass 

보시다시피, 그것은 자체 목록을 정의하고 검색하는 방법입니다. 당신이 당신의 viewset 클래스에 당신의 것을 쓸 때, 그것들은 완전히 무시됩니다.

그래서 대답은 자신 만의 목록을 작성하고 함수를 검색해야하거나 기본 목록을 사용하고 뷰/뷰셋에 내장 된 함수를 검색 할 수있는 경우 데코레이터를 사용하는 것입니다.

+0

그건 내 방법으로 슈퍼를 부르지 않기 때문에 내가 생각한거야. 나는 슈퍼를 부르는 방법을 찾아 낼 수 없었고, 내가 필요한 일을 계속했다. – Soviut

관련 문제