Django +禁用扩展视图集缓存



如何为以下场景中的一个视图集禁用Django缓存?我想禁用缓存的viewset与名称SecondViewSet,我使用@method_decorator(never_cache, name="list")在SecondViewSet它不工作,请告知

抽象Viewset

class AbstractDataViewSet(ListAPIView):
http_method_names = ['get', 'options']
permission_classes = [IsAuthorizedUser]
@method_decorator(cache_page(settings.VIEWSET_CACHE_TIMEOUT))
def list(self, request, *args, **kwargs):
return Response(data={"message":"appdata"}

第一个Viewset

class FirstViewSet(AbstractDataViewSet):
group_permissions = {
'GET': (
roles.ACCOUNTING,
)
}

第二Viewset

class SecondViewSet(AbstractDataViewSet):
group_permissions = {
'GET': (
roles.ACCOUNTING,
)
}

第三Viewset

class ThirdViewSet(AbstractDataViewSet):
group_permissions = {
'GET': (
roles.ACCOUNTING,
)
}

如果装饰器适当地使用了functools.wraps或类似的属性,您应该能够访问__wrapped__属性,并有效地撤消装饰器。

class SecondViewSet(AbstractDataViewSet):
list = AbstractDataViewSet.list.__wrapped__

或者,您可以从list方法委托的修饰方法中分离出另一个方法。然后,只需在子类中重新定义该方法,以定义它时不使用修饰符。


class AbstractDataViewSet(ListAPIView):
http_method_names = ['get', 'options']
permission_classes = [IsAuthorizedUser]
def _list(self, request, *args, **kwargs):
return Response(data={"message":"appdata"}
@method_decorator(cache_page(settings.VIEWSET_CACHE_TIMEOUT))
def list(self, request, *args, **kwargs):
return self._list(request, *args, **kwargs)
...
class SecondViewSet(AbstractDataViewSet):
# define list again to avoid caching decorator
def list(self, request, *args, **kwargs):
return self._list(request, *args, **kwargs)

这些方法不需要改变装饰器的实现就可以工作。另一种方法可能是更改装饰器的实现,以检查类属性以确定应该缓存哪些方法。

最新更新