对于现在的动态网站来讲,所有的界面展示都是通过客户端请求服务端,服务端再去请求数据库,然后将请求到的数据渲染后返回给客户端。用户每次访问页面都需要去请求数据库,如果同时有多个人访问的话,对于我们的数据库的压力是相当大的。

所以我们会想,对于不是经常变更的数据,或者不需要实时更新展示的数据,我们可以将数据存放在缓存中,用户下次需要数据的时候,服务端直接从缓存中拿到数据返回给用户即可,不需要每次都去数据库查询,这样会大大降低数据库的压力,提升用户访问速度。

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缓存的更多相关文章

  1. drf 缓存扩展

    drf缓存给了一个非常方便的扩展,使用起来相当方便 1-   安装 pip install drf-extensions 2-配置 在settings里面增加两项配置 # drf扩展REST_FRAM ...

  2. DRF JWT的用法 & Django的自定义认证类 & DRF 缓存

    JWT 相关信息可参考: https://www.jianshu.com/p/576dbf44b2ae DRF JWT 的使用方法: 1. 安装 DRF JWT # pip install djang ...

  3. DRF 缓存解决方案 drf-extensions / redis

    drf-extensions 概述 drf-extensions组件内部提供了 DRF  的本地内存方式的缓存方式 本地内存方式缓存在项目重启后则会消失 官方点击 这里 安装 pip3 install ...

  4. 44.drf缓存

    DRF原有缓存 Django缓存.配置:https://www.cnblogs.com/Mickey-7/p/15792083.html   Django为基于类的视图提供了一个 method_dec ...

  5. Django+Vue打造购物网站(十)

    首页.商品数量.缓存和限速功能开发 将环境切换为本地,vue也切换为本地 轮播图 goods/serializers.py class BannerSerializer(serializers.Mod ...

  6. Django商城项目笔记No.16用户部分-用户中心收货地址

    首先完成省市区三级联动 新建areas应用 python ../../manage.py startapp areas 模型类代码 class Area(models.Model): "&q ...

  7. django Rest Framework---缓存通过drf-extensions扩展来实现

    什么情况下使用缓存 1.不经常更新的数据 2.用户经常访问的一些页面,比如商品列表页.商品详情页等 3.用户经常修改的一些操作:购物车.订单中心等 关于DRF缓存扩展可以参考文档:http://chi ...

  8. drf版本控制 和django缓存,跨域问题,

    drf版本控制 基于url的get传参方式 REST_FRAMEWORK={ # "DEFAULT_AUTHENTICATION_CLASSES":["app01.aut ...

  9. 一.rest-framework之版本控制 二、Django缓存 三、跨域问题 四、drf分页器 五、响应器 六、url控制器

    一.rest-framework之版本控制 1.作用 用于版本的控制 2.内置的版本控制 from rest_framework.versioning import QueryParameterVer ...

随机推荐

  1. web server性能优化浅谈

    作者:ZhiYan,Jack47 转载请保留作者和原文出处 Update: 2018.8.8 在无锁小节增加了一些内容 性能优化,优化的东西一定得在主路径上,结合测量的结果去优化.不然即使性能再好,逻 ...

  2. 查找第三方银行官方app下载链接探索过程

    需求:最近有个需求,点击按钮,弹出一个所需银行选项的非全屏弹出层,再点击某银行选项,随即跳转到该银行的app下载界面,如下图所示           注:这里只是引用相关银行的链接,不需要做什么逻辑处 ...

  3. qml demo分析(threadedanimation-线程动画)

    一.效果预览 使用过qml的同学都知道,使用qml做动画效果是非常简单的,再也不需要像QWidget那样,自己模拟一个动画,费时又费力,往往还达不到效果.今天我们就来分析下qml的两种动画实现方式,如 ...

  4. ASP.NET Core DevOps

    一.本系列教程说明 源代码管理工具:Gogs 持续集成工具:Jenkins 容器:Docker 本教程选用轻量级的 Git 管理工具 Gogs,搭建简单. 三.教程目录 1.配置免费HTTPS证书 ( ...

  5. 【Android Studio安装部署系列】十、Android studio打包发布apk安装包

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 使用Android studio发布apk安装包的操作步骤. 开始打包发布apk Build > Generate Signe ...

  6. [Leetcode]450. Delete Node in a BST

    Given a root node reference of a BST and a key, delete the node with the given key in the BST. Retur ...

  7. XSS 绕过技术

    XSS Cross-Site Scripting(XSS)是一类出现在 web 应用程序上的安全弱点,攻击者可以通过 XSS 插入一 些代码,使得访问页面的其他用户都可以看到,XSS 通常是可以被看作 ...

  8. Docker进阶之四:镜像管理

      一.什么是镜像? 简单说,Docker镜像是一个不包含Linux内核而又精简的Linux操作系统. 二.镜像从哪里来? Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容 ...

  9. kubectl自动补全

    source <(kubectl completion bash) echo "source <(kubectl completion bash)" >> ...

  10. Java——泛型

    前言 一般的类和方法,使用的都是具体的类型:基本类型或者自定义的类.如果我们要编写出适用于多种类型的通用代码,那么肯定就不能使用具体的类型.前面我们介绍过多态,多态算是一种泛化机制,但是也会拘泥于继承 ...