DRF原有缓存

 
Django为基于类的视图提供了一个 method_decorator 装饰器,用于为类视图添加缓存类别的装饰器, cache_page 和 vary_on_cookie
cache_page可以指定缓存时间(单位秒)
class UserViewSet(viewsets.Viewset):
# 为每个用户缓存2个小时的请求url
# cache_page 装饰器只缓存返回200状态的 GET 和 HEAD 响应
@method_decorator(cache_page(60*60*2))
@method_decorator(vary_on_cookie)
def geyUserList(self, request, format=None):
...
 

drf-extensions缓存

drf-extensions缓存流程

  • 收到用户请求时,会根据对应的参数生成一个key
  • 通过对应的key去差值是否有对应的value,有的话封装成对应的response返回
  • 如果没有对应的value,则执行视图方法,并将结果存储,以便下次使用

使用drf-extensions缓存

#安装
pip3.9 install drf-extensions
drf-extensions提供的cache_response装饰器可以直接应用于get方法上,而无需使用method_decorator进行转换
适用于继承了rest_framework.views.APIView的类,且需要返回一个rest_framework.response.Response的实例
#导包
from rest_framework_extensions.cache.decorators import cache_response
使用@cache_response对视图类的方法进行缓存
class getInfoLIst(APIView):
authentication_classes = [JwtQueryParamsAuthentication, ]
@cache_response(60*60,cache='info_cache')
def get(self, request, *args, **kwargs):
...

cache_response装饰器参数

  • timeout:缓存有效时间,默认为None,永久缓存
  • key_func:指定缓存键,默认情况下,每个来自@cache_response装饰器的缓存数据都由key存储,使用DefaultKeyConstructor计算
  • cache:指定装饰器在缓存结果时使用特定的缓存,一般情况下使用默认的default 缓存
  • cache_errors:默认情况下,每个response都会被缓存,包括错误,如果第一次请求的时候中间出现错误,那么在缓存有效期内,每一次的请求都将会直接将之前缓存的错误信息返回给我们
# 不提供参数的话,可以在settings中配置公共缓存配置
REST_FRAMEWORK_EXTENSIONS = {
# 缓存时间
'DEFAULT_CACHE_RESPONSE_TIMEOUT': 60 * 60,
# 缓存存储
'DEFAULT_USE_CACHE': 'default',
#cache_error
'DEFAULT_CACHE_ERRORS':False

CacheResponseMixin

drf-extensions扩展对于缓存提供了三个扩展类:
  • ListCacheResponseMixin : 提供了缓存返回列表数据的视图,本质是为 mixins.ListModelMixin 的list()添加了cache_response装饰器
  • RetrieveCacheResponseMixin:用于返回单一数据的是图,本质是为 mixins.RetrieveModelMixin 添加了cache_response装饰器
  • CacheResponseMixin:提供了List和Retrieve两种缓存,与ListModelMixin和RetrieveModelMixin一起配合使用
 
from rest_framework_extensions.cache.mixins import CacheResponseMixin

# 需要将CacheResponseMixin加入到我们的试图类函数第一个继承类位置
class UserViewSet(CacheResponseMixin,viewsets.ModelViewSet):
serializer_class = UserSerializer
....

drf-extensions使用redis缓存

#安装
django-redis pip3.9 install django-redis
#settings
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379",  
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
       "PASSWORD":"r_password"
"CONNECTION_POOL_KWARGS": {"max_connections": 100} # 配置连接池
}
}
}

最新文章

  1. 使用Innosetup制作安装包的一些技巧
  2. SUDT2177体检
  3. UIAlertController (UIActionSheet, UIAlertView is deprecated in iOS 8.)
  4. Jquery去除从数据库中查询到的内容含有的p标签
  5. 五个典型的JavaScript面试题
  6. ViewPager+Fragment实现支持左右滑动的Tab
  7. 积累的VC编程小技巧之编辑框
  8. Linux环境下Android JNI程序的编译
  9. C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(Entity Framework)的类名
  10. mac 配置jdk,maven环境变量
  11. Eclipse安装lombok及常用注解
  12. Netty实践二(心跳检测)
  13. WPF自定义TabControl样式
  14. Beginning SDL 2.0(5) 基于MFC和SDL的YuvPlayer
  15. MongoVUE破解
  16. delphi WebBrowser的使用方法详解(四)-webbrowser轻松实现自动填表
  17. docker registry ui
  18. Linux文件目录管理
  19. AngularJs2 构建简单的英雄编辑器
  20. PAT——1033. 旧键盘打字

热门文章

  1. Mybatis完整版详解
  2. Python 工匠: 异常处理的三个好习惯
  3. Luogu P3273 [SCOI2011]棘手的操作(左偏树)
  4. LeetCode 593. 有效的正方形(向量做法)
  5. QQ高级功能
  6. Android下的Drawable使用
  7. 小技巧:webpack中@的配置和用法
  8. 【题解笔记】PTA基础6-10:阶乘计算升级版
  9. Homework7
  10. TortoiseSVN 执行清理( cleanUp )失败的解决方案