4

我正在使用 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端点时,不在list()方法中缓存响应的方法是什么,但它应该缓存在 list 方法中调用的任何其他内容。

谢谢!

4

1 回答 1

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)

注意这里list的定义和source是一样的,我没有改,这里只是演示如何缓存。

于 2019-09-12T19:19:31.640 回答