Ответ кеша Django rest framework в методе списка на основе query_params

Я использую платформу django rest для моделирования представлений API. У меня есть класс API ModelViewSet, который имеет два метода действия: list() и retrieve().

Пример метода получения():

@method_decorator(never_cache)
def retrieve(self, request, *args, **kwargs):
    # /en/api/v1/pair/<parameter> calls this method
    ...
    return Response(some_data)

Пример метода list():

@method_decorator(cache_page(settings.PAIR_CACHE_LIFETIME))
def list(self, request, *args, **kwargs):
    # /en/api/v1/pair/, /en/api/v1/pair/?name=<parameter> calls this method
    # /en/api/v1/pair/ and /en/api/v1/pair/?name=all - response SHOULD be cached
    # /en/api/v1/pair/?name=random and /en/api/v1/pair/?name=CORRECT_PAIR_NAME - SHOULD NOT be cached
    ...
    return Response(some_data)

Когда запрос GET отправляется на /en/api/v1/pair, он вызывает метод списка, который декорирован для кэширования ответа. Когда GET-запрос отправляется на /en/api/v1/pair/, он вызывает метод получения, оформленный как never_cache.

Я добавляю функцию возврата случайной пары, когда запрос GET отправляется в /en/api/v1/pair/?name=random. Но поскольку он вызывает метод списка, результат кэшируется на некоторое время и какое-то время возвращает один и тот же ответ.

Как НЕ кэшировать ответ в методе list(), когда вызывается конечная точка /en/api/v1/pair/?name=random, но это должно кешировать все, что еще вызывается в методе списка.

Благодарю вас!


person Igoris Skinderis    schedule 14.09.2018    source источник


Ответы (1)


Я сделал

from django.views.decorators.cache import cache_page 
from django.utils.decorators import method_decorator   

class MyViewSet(viewsets.ModelViewSet):                                                                                                                                                                                            
    serializer_class = MySerializer                                                                                 

    @method_decorator(cache_page(60*5)) # cache for 5 minutes                                                          
    def list(self, request, format=None):                                                                              
        queryset = self.filter_queryset(self.get_queryset())                                                           

        page = self.paginate_queryset(queryset)                                                                        
        if page is not None:                                                                                           
            serializer = self.get_serializer(page, many=True)                                                          
            return self.get_paginated_response(serializer.data)                                                        

        serializer = self.get_serializer(queryset, many=True)                                                          
        return Response(serializer.data)

Обратите внимание, что здесь определение списка такое же, как и в источнике, т.е. я его не менял, он здесь только для демонстрации того, как его кешировать.

person Harry Moreno    schedule 12.09.2019