闽公网安备 35020302035485号
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 cachepip 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的缓存更新机制,这一点一定要注意一下。所以如果你有精力,对于每一个接口你都可以编写其缓存逻辑,但是更有性价比的方案是,对于那些实在不经常更新的数据,你可以使用缓存,而对于经常更新的数据,你可以把缓存时间设置小一点。