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 ...
随机推荐
- Window10升级遇到大坑错误代码:0xc000000e完美解决方案
昨天忽然升级了,然后并没有立即重启更新,因为但是正在工作所以等下班回到家后就是一直提示:文件:\Windows\system32\winload.efi 错误代码:0xc000000e!!! 如下图所 ...
- spring mvc多个请求的影响 和使用全局变量
对于那些会以多线程运行的单例类(比如spring mvc中的controller,dao,service): 局部变量不会受多线程影响 成员变量会受到多线程影响 如果方法里有成员变量,只有读操作,不受 ...
- 从零开始学习PYTHON3讲义(十)自己做一个“电子记事本”
<从零开始PYTHON3>第十讲 截至上一讲,我们已经完成了Python语言的基本部分.我们用了三讲来讨论Python语言的控制结构,用了两讲来介绍Python的基本数据类型.可以说仅就语 ...
- with open为什么会自动关闭文件流
操作文件我们通常需要手动关闭文件流,可是通过with open()的时候却可以自动关闭,这是为什么呢?其实这就是上下文管理器.我们来看一个例子 #!/usr/bin/env python # -*- ...
- 图解Go语言内存分配
目录 基础概念 内存管理单元 内存管理组件 mcache mcentral mheap 内存分配流程 总结 参考资料 Go语言内置运行时(就是runtime),抛弃了传统的内存分配方式,改为自主管理. ...
- 【Golang笔记】Golang工具包Cobra安装记录
0.环境信息 系统:Win10_x64 Go版本:go version go1.8.1 windows/amd64 Git版本:git version 2.17.0.windows.1 1.安装Go运 ...
- select标签 禁止选择但又能通过序列化form表单传值到后台
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁止选择但又能通过序列化form表单传值到后台,但是当我们使用disabled="disabled"时发现,无法序列化 ...
- .net core api +swagger(一个简单的入门demo 使用codefirst+mysql)
前言: 自从.net core问世之后,就一直想了解.但是由于比较懒惰只是断断续续了解一点.近段时间工作不是太忙碌,所以偷闲写下自己学习过程.慢慢了解.net core 等这些基础方面学会之后再用.n ...
- Java笔记(day11)
异常:是在运行时期发生的不正常情况. 异常类:在java中用类的形式对不正常情况进行了描述和封装对象,描述不正常的情况的类. 异常就是java通过面向对象的思想将问题封装成了对象.用异常类对其进行描述 ...
- Java运行时环境---内存划分
背景:听说Java运行时环境的内存划分是挺进BAT的必经之路. 内存划分: Java程序内存的划分是交由JVM执行的,而不像C语言那样需要程序员自己买单(C语言需要程序员为每一个new操作去配对del ...