3.缓存的更新机制
from django.views.decorators.cache import cache_page @cache_page(60 * 15) def my_view(request): ...当你第一次调用这个接口的时候,django会为这个接口创建一个60*15秒的缓存,当你后面再去访问的时候,访问速度就会快很多。需要注意的是,你需要考虑缓存的刷新机制, 一般情况下,缓存不会自动刷新,你需要自己去手动更新,可以说这是一个弊端。
# 堆代码 duidaima.com class MeasuringPointViewSet(viewsets.ModelViewSet): queryset = models.MeasuringPoint.objects.all().order_by('mpoint_id') serializer_class = MeasuringPointSerializer @method_decorator(cache_page(60 * 60)) def list(self, request, *args, **kwargs): """根据项目获取所有测点""" project_id = request.query_params.get('project_id') queryset = self.get_queryset().filter(project_id=project_id) serializer = self.get_serializer(results, many=True) return paginator.get_paginated_response(serializer.data)DRF cache
pip install drf-extensions2.在views.py 中引入缓存类:
from rest_framework_extensions.cache.decorators import cache_response3.替换@method_decorator(cache_page(60 * 60))为@cache_response(key_func='get_cache_key'),并添加get_cache_key函数:
class MeasuringPointViewSet(viewsets.ModelViewSet): queryset = models.MeasuringPoint.objects.all().order_by('mpoint_id') serializer_class = MeasuringPointSerializer @staticmethod def get_cache_key(request, *args, **kwargs): project_id = request.query_params.get('project_id') return f'{request.path}?project_id={project_id}' @cache_response(key_func='get_cache_key') def list(self, request, *args, **kwargs): """根据项目获取所有测点""" paginator = CustomPagination() project_id = request.query_params.get('project_id') queryset = self.get_queryset().filter(project_id=project_id) results = paginator.paginate_queryset(queryset, request) serializer = self.get_serializer(results, many=True) return paginator.get_paginated_response(serializer.data)这里的get_cache_key函数根据请求的URL和参数构建出缓存的Key值,以避免不同参数的请求缓存混淆。现在每次数据更新时,DRF会自动清除缓存,确保获取到的数据是最新的。
3.从缓存中读取的数据已经过期。
2.如果你使用了django自带的admin管理系统,当你在后台修改数据的时候,使用cache_response也是无法自动刷新数据的,因为django自带的管理系统是直接修改数据库中的数据,并不会触发cache_response的缓存更新机制,这一点一定要注意一下。所以如果你有精力,对于每一个接口你都可以编写其缓存逻辑,但是更有性价比的方案是,对于那些实在不经常更新的数据,你可以使用缓存,而对于经常更新的数据,你可以把缓存时间设置小一点。