You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:09:03