如何在Django REST Framework视图中适配编程式缓存方案?
适配手动缓存到DRF ListAPIView的实现
当然可以把这种手动操作缓存的方式适配到DRF的ListAPIView中,下面是修改后的完整代码,同时修正原示例里的一处小错误(序列化器的model字段写错了,应该是Item而非Pair):
修改后的完整代码
# 导入需要的缓存模块 from django.core.cache import cache from django.conf import settings from django.core.cache.backends.base import DEFAULT_TIMEOUT from rest_framework import generics, serializers from rest_framework.response import Response from .models import Item # 修正后的序列化器 class ItemSerializer(serializers.ModelSerializer): class Meta: model = Item # 原示例里写成了Pair,这里修正 fields = '__all__' # 整合缓存逻辑的视图 class ItemsList(generics.ListAPIView): queryset = Item.objects.all() serializer_class = ItemSerializer # 配置缓存超时时间,优先读取settings里的配置,默认用全局默认值 CACHE_TTL = getattr(settings, 'CACHE_TTL', DEFAULT_TIMEOUT) # 定义缓存键,可根据需求调整(比如加入请求参数区分不同缓存) CACHE_KEY = 'items_list_all' def list(self, request): # 先检查缓存中是否存在数据 cached_data = cache.get(self.CACHE_KEY) if cached_data: return Response(cached_data) # 缓存不存在时,执行原有的查询和序列化逻辑 queryset = self.get_queryset() serializer = ItemSerializer(queryset, many=True) response_data = serializer.data # 将序列化后的数据存入缓存,设置超时时间 cache.set(self.CACHE_KEY, response_data, timeout=self.CACHE_TTL) return Response(response_data)
关键说明
- 缓存键的灵活性:如果你的接口需要支持过滤、分页等参数,建议把请求的关键参数(比如
request.query_params的哈希值)加入缓存键,避免不同参数的请求共用同一份缓存。比如可以改成:import hashlib query_str = request.GET.urlencode() cache_key = f'items_list_{hashlib.md5(query_str.encode()).hexdigest()}' - 缓存失效处理:如果Item模型的数据有更新(新增、修改、删除),需要手动清除对应的缓存键,否则用户会看到旧数据。可以通过Django信号(
django.db.models.signals)实现自动清除,比如在post_save和post_delete信号中调用cache.delete(self.CACHE_KEY)。 - 超时时间配置:可以在项目的
settings.py中添加CACHE_TTL来统一设置缓存时长,比如CACHE_TTL = 60 * 15(15分钟)。
内容的提问来源于stack exchange,提问作者user840718
相关产品推荐
相关产品推荐

