基于查询参数的Django-rest框架在列表方法中的缓存响应

2024-04-18 04:08:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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()方法示例:

^{pr2}$

当GET请求被发送到/en/api/v1/pair时,它将调用列表方法修饰为缓存响应。 当GET请求发送到/en/api/v1/pair/时,它调用retrieve方法,该方法被修饰为never-chate。在

GET请求发送到/en/api/v1/pair/?名称=随机。 但是当它调用list方法时,返回值被缓存一段时间,并在一段时间内返回相同的响应。在

/en/api/v1/pair/时,如何不在list()方法中缓存响应?name=random端点被调用,但它应该缓存list方法中调用的任何内容。在

谢谢你!在


Tags: django方法框架restapi示例get建模
1条回答
网友
1楼 · 发布于 2024-04-18 04:08:46

是的

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相同,也就是说,我没有更改它,这里只是演示如何缓存它。在

相关问题 更多 >