Django + 禁用扩展视图集的缓存

约翰

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

抽象视图集

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"}

第一个视图集

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

第二个视图集

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

第三个视图集

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)

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章