【问题标题】:Django rest framework cache response in list method based on query_params基于query_params的列表方法中的Django rest框架缓存响应
【发布时间】:2019-02-19 08:20:06
【问题描述】:

我正在使用 django rest 框架来建模 api 视图。我有一个 API ModelViewSet 类,它有两个操作方法:list()retrieve()

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 - 它调用 list 方法来缓存响应。 当 GET 请求被发送到 /en/api/v1/pair/ - 它调用retrieve 方法,该方法被修饰为 never_cache。

GET 请求发送到 /en/api/v1/pair/?name=random 时,我正在添加返回随机对的功能。 但是由于它调用list方法,所以返回会被缓存一段时间,并返回相同的响应一段时间。

当调用 /en/api/v1/pair/?name=random 端点时,在 list() 方法中不缓存响应的方法是什么,但它应该缓存列表方法中调用的任何其他内容。

谢谢!

【问题讨论】:

    标签: python django api django-rest-framework django-2.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是一样的,也就是我没改过,这里只是演示如何缓存。

    【讨论】:

      猜你喜欢
      • 2016-12-27
      • 2018-12-08
      • 2017-08-11
      • 2017-03-12
      • 2020-03-18
      • 2020-03-01
      • 2020-06-17
      • 2013-04-07
      • 1970-01-01
      相关资源
      最近更新 更多