DRF缓存
对于现在的动态网站来讲,所有的界面展示都是通过客户端请求服务端,服务端再去请求数据库,然后将请求到的数据渲染后返回给客户端。用户每次访问页面都需要去请求数据库,如果同时有多个人访问的话,对于我们的数据库的压力是相当大的。
所以我们会想,对于不是经常变更的数据,或者不需要实时更新展示的数据,我们可以将数据存放在缓存中,用户下次需要数据的时候,服务端直接从缓存中拿到数据返回给用户即可,不需要每次都去数据库查询,这样会大大降低数据库的压力,提升用户访问速度。
Django提供了多种缓存方法,具体可以参考:https://docs.djangoproject.com/zh-hans/2.1/topics/cache/
下面我们来看看DRF缓存,它对Django的缓存进行了一层封装,使我们用起来更加方便
1、使用drf-extensions
Django REST Framework中使用缓存,可以使用GitHub上提供的drf-extensions扩展来实现
GitHub地址:https://github.com/chibisov/drf-extensions
参考文档:http://chibisov.github.io/drf-extensions/docs/#caching
drf-extensions 缓存工作原理:
收到用户请求时,会根据请求对应的 view_instance, view_method, request, args, kwargs 等生成一个key,然后通过这个key去内存中查找是否有对应的value,如果有value,将其封装成对应的response返回给客户端
如果通过key没有找到对应的value,则去执行我们的视图函数对应的方法,并将结果作为key值保存在内存中,以便下次使用。

1)安装drf-extensions:pip install drf-extensions
2)使用方法:
首先需要安装 drf-extensions 库:pip install drf-extensions
1)使用装饰器方式
@cache_response
它适用于继承了rest_framework.views.APIView的类,且需要返回一个rest_framework.response.Response的实例
用法如下:
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framwork_extensions.cache.decorator import cache_response
class GoodListView(APIView):
@cache_response()
def get(self, request, format=None):
goods = Goods.objects.all()[:10]
goods_serializer = GoodListSerializer1(goods, many=True)
return Response(goods_serializer.data)
第一次访问goods接口,看到使用的时间是1.44s

然后我们再次刷新界面,看到goods接口只是用了259ms

@cache_response()接受4个参数

a)timeout:指定过期时间,单位为秒,即缓存有效期时间。默认为None,即永久缓存,我们也可以在设置文件中修改此参数
REST_FRAMEWORK_EXTENSIONS = {
'DEFAULT_CACHE_RESPONSE_TIMEOUT':60*15 # 即指定有效期为15分钟
}
b)key_func:指定缓存键,默认情况下,每个来自@cache_response装饰器的缓存数据都由key存储,使用DefaultKeyConstructor计算
c)cache:指定装饰器在缓存结果时使用特定的缓存,一般情况下,我们会直接使用默认的default 缓存
d)cache_errors:默认情况下,每个response都会被缓存,包括错误,所以如果我们第一次请求的时候中间出现错误,那么在缓存有效期内,每一次的请求都将会直接将之前缓存的错误信息返回给我们。
我们可以通过修改cache_errors的值为False来改变这种行为。
REST_FRAMEWORK_EXTENSIONS = {
'DEFAULT_CACHE_RESPONSE_TIMEOUT':60*15, # 即指定有效期为15分钟
‘DEFAULT_CACHE_ERRORS’:False
}
2)使用CacheResponseMixin
用于缓存标准视图retrieve和list方法。和viewset搭配使用。
CacheResponseMixin本质上也是使用@Cache_response()装饰器实现,在它的基础上进行了进一步封装,使得使用更加便捷
mixin的示例使用方法:
from rest_framework_extensions.cache.mixins import CacheResponseMixin
class GoodListView3(CacheResponseMixin,mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
queryset = Goods.objects.all().order_by("add_time")
serializer_class = GoodListSerializer1
pagination_class = GoodPageView
只需要将CacheResponseMixin加入到我们的试图类函数第一个继承类位置即可。

查看rest_framework_extensions.cache.mixins,可以看到,它下面提供了四个类:
BaseCacheResponseMixin:公共类,只是指定了默认的缓存键功能
ListCacheResponseMixin:继承自BaseCacheResponseMixin,针对list方法缓存
RetrieveCacheResponseMixin:针对retrieve方法缓存
CacheResponseMixin:继承了ListCacheResponseMixin和RetrieveCacheResponseMixin,即既可以对list也可以针对retrieve方法进行缓存。
2、使用redis缓存(Django-redis)
参考文档:https://django-redis-chs.readthedocs.io/zh_CN/latest/
GitHub:https://github.com/niwinz/django-redis
1)需要安装django-redis:pip install django-redis
2)配置:
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
如果有密码的话,可以在url中:LOCATION:'redis://:password@ip:port',也可以配置在OPTIONS中
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD":"password"
}
3)具体redis的安装及配置,可以见之前的博客 Linux下redis的安装及配置 或 windows下redis安装及配置
DRF缓存的更多相关文章
- drf 缓存扩展
drf缓存给了一个非常方便的扩展,使用起来相当方便 1- 安装 pip install drf-extensions 2-配置 在settings里面增加两项配置 # drf扩展REST_FRAM ...
- DRF JWT的用法 & Django的自定义认证类 & DRF 缓存
JWT 相关信息可参考: https://www.jianshu.com/p/576dbf44b2ae DRF JWT 的使用方法: 1. 安装 DRF JWT # pip install djang ...
- DRF 缓存解决方案 drf-extensions / redis
drf-extensions 概述 drf-extensions组件内部提供了 DRF 的本地内存方式的缓存方式 本地内存方式缓存在项目重启后则会消失 官方点击 这里 安装 pip3 install ...
- 44.drf缓存
DRF原有缓存 Django缓存.配置:https://www.cnblogs.com/Mickey-7/p/15792083.html Django为基于类的视图提供了一个 method_dec ...
- Django+Vue打造购物网站(十)
首页.商品数量.缓存和限速功能开发 将环境切换为本地,vue也切换为本地 轮播图 goods/serializers.py class BannerSerializer(serializers.Mod ...
- Django商城项目笔记No.16用户部分-用户中心收货地址
首先完成省市区三级联动 新建areas应用 python ../../manage.py startapp areas 模型类代码 class Area(models.Model): "&q ...
- django Rest Framework---缓存通过drf-extensions扩展来实现
什么情况下使用缓存 1.不经常更新的数据 2.用户经常访问的一些页面,比如商品列表页.商品详情页等 3.用户经常修改的一些操作:购物车.订单中心等 关于DRF缓存扩展可以参考文档:http://chi ...
- drf版本控制 和django缓存,跨域问题,
drf版本控制 基于url的get传参方式 REST_FRAMEWORK={ # "DEFAULT_AUTHENTICATION_CLASSES":["app01.aut ...
- 一.rest-framework之版本控制 二、Django缓存 三、跨域问题 四、drf分页器 五、响应器 六、url控制器
一.rest-framework之版本控制 1.作用 用于版本的控制 2.内置的版本控制 from rest_framework.versioning import QueryParameterVer ...
随机推荐
- Pytorch系列教程
介绍 不久前Pytorch发布了1.0版本,官网的doc页也更新了.这里说下官网的教程很实用,边学pytorch搭网络边学NLP-图像等领域的先进技术. 官网的教程都是英文的,本人就用这个系列博客做个 ...
- 第1章 程序设计和C语言
1.1什么是计算机程序 程序,就是一组计算机能识别和执行的指令.每一条指令使计算机执行特定的操作.只要让计算机执行这个程序,计算机就会“自动地”执行各条指令,有条不紊地进行工作. 1.2什么是计算机语 ...
- python3 - 文本读音器
本篇分享的是使用python3制作一个文本读音器,简单点就是把指定的文本文字转语音说出来:做这么个小工具主要是为了方便自己在平时看一些文章眼累的时候,可通过语音来帮助自己,当然如果你是小说迷,可以扩展 ...
- 深入浅出一下Java的HashMap
在平常的开发当中,HashMap是我最常用的Map类(没有之一),它支持null键和null值,是绝大部分利用键值对存取场景的首选.需要切记的一点是——HashMap不是线程安全的数据结构,所以不要在 ...
- Python:黑板课爬虫闯关第五关
第五关是最后一关了,至此之后黑板课就没有更新过关卡了. 第五关地址:http://www.heibanke.com/lesson/crawler_ex04/ 可以看到,是在第三关的基础上加了验证码. ...
- Redis哨兵机制
Redis Sentinel物理结构图 角色 IP Port 别名 master 127.0.01 6379 主节点 slave-1 127.0.01 6380 slave-1节点 slave-2 1 ...
- Virtual Box虚拟机Ubuntu系统安装及基本配置
Linux简介 什么是 Linux? Linux:世界上不仅只有一个 Windows 操作系统,还有 Linux.mac.Unix 等操作系统.桌面操作系统下 Windows 是霸主,而 Linux ...
- Spring Boot配置定时任务
在项目开发过程中,经常需要定时任务来做一些内容,比如定时进行数据统计(阅读量统计),数据更新(生成每天的歌单推荐)等. Spring Boot默认已经实现了,我们只需要添加相应的注解就可以完成定时任务 ...
- 搞懂Redis RDB和AOF持久化及工作原理
前言 因为Redis的数据都储存在内存中,当进程退出时,所有数据都将丢失.为了保证数据安全,Redis支持RDB和AOF两种持久化机制有效避免数据丢失问题.RDB可以看作在某一时刻Redis的快照(s ...
- DSAPI Wifi热点的扫描与连接
使用DSAPI扫描和连接Wifi热点,支持连接隐藏的SSID. 效果演示: 代码如下: Private Wifi As New DSAPI.网络.Wifi Private Sub Button1_Cl ...