如何在Django Rest Framework中为ClassBasedAPIViews设置缓存?
DRF类视图添加缓存的优雅实现方案
方案1:视图层装饰(推荐,逻辑内聚)
无需修改路由代码,直接通过Django提供的method_decorator将缓存装饰器绑定到类视图的dispatch入口方法上,所有请求方法都会自动生效,代码可读性更高:
# views.py 新增导包 from django.utils.decorators import method_decorator from django.views.decorators.cache import cache_page from django.views.decorators.vary import vary_on_headers # 在类上添加装饰器 @method_decorator(cache_page(300), name='dispatch') @method_decorator(vary_on_headers('Authorization'), name='dispatch') class ProductListAPIView(ListAPIView): permission_classes = [IsAuthenticated] queryset = Product.objects.all() serializer_class = ProductSerializer
对应urls.py保持原有写法即可:
path('', ProductListAPIView.as_view(), name='products')
方案2:路由层封装装饰组合
如果不想修改原有视图代码,可提前将多个装饰器组合为单个变量,避免路由中的嵌套写法:
# urls.py 新增导包 from django.views.decorators.cache import cache_page from django.views.decorators.vary import vary_on_headers # 提前组合缓存装饰器 product_cache_decorator = vary_on_headers('Authorization')(cache_page(300)) urlpatterns = [ path('', product_cache_decorator(ProductListAPIView.as_view()), name='products'), # 其他路由规则 ]
两种方案的运行效果和你之前的嵌套写法完全一致,方案1更符合代码内聚的设计原则,优先推荐使用。如果有多个视图需要复用相同的缓存规则,可将装饰器组合封装为公共工具直接导入使用。
内容的提问来源于stack exchange,提问作者Uzzal H. Mohammad
相关产品推荐
相关产品推荐

