首页 > 其他分享 >44.drf缓存

44.drf缓存

时间:2022-10-17 18:56:16浏览次数:70  
标签:缓存 44 cache redis extensions response drf

DRF原有缓存

Django缓存、配置:https://www.cnblogs.com/Mickey-7/p/15792083.html   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} # 配置连接池
        }
    }
}
 

标签:缓存,44,cache,redis,extensions,response,drf
From: https://www.cnblogs.com/Mickey-7/p/16800239.html

相关文章

  • LeetCode 144 94 145 关于前中后序遍历二叉树的思考(包含迭代法)
    用系统堆栈实现(递归)很容易实现:前序:do(),递归左儿子,递归右儿子中序:递归左儿子,do(),递归右儿子后序:递归左儿子,递归右儿子,do()用自定义栈实现(迭代法)首先首......
  • 为什么用 Redis 作为 MySQL 的缓存?
    主要是因为 Redis具备「高性能」和「高并发」两种特性。1、Redis具备高性能假如用户第一次访问MySQL中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用......
  • 安卓手机微信中清除页面缓存的方法
    安卓手机微信中清除页面缓存的方法只在安卓中有效,ios微信刷新页面即可清除缓存。1.微信中打开网页 ​​http://debugx5.qq.com​​。2.滑动到底部,如图所示勾选4个缓存选项,......
  • Redis缓存穿透、击穿、雪崩、概念及解决办法
    一、缓存穿透1、缓存穿透理解  缓存穿透是指查询一个根本不存在的数据,缓存层和持久层都不会命中。在日常工作中出于容错的考虑,如果从持久层查不到数据则不写入缓存层,缓......
  • 基于redis的查询业务缓存实现
    添加缓存业务流程及代码实现业务流程说明:1、先从redis中进行查询,redis中如果有对应的数据则直接返回;如果没有再进入数据库查询2、从数据库查询到的数据判断是否为空......
  • DRF入门
    目录Django请求生命周期流程图下载安装restful规范序列化和反序列化drf快速使用CBV源码流程分析DRF之APIView和Request对象分析DjangoView和DRFAPIView的小插曲APIView的......
  • 1441. 用栈操作构建数组
    本题非常简单,一个简单的模拟题解题思路:如果两个相邻数字相差不为1,那么对两个数字的差值减1进行“Push”和“Pop”如果两个相邻数字相差不1,那么直接“Push”即可......
  • LeetCode 2444. Count Subarrays With Fixed Bounds
    原题链接在这里:https://leetcode.com/problems/count-subarrays-with-fixed-bounds/题目:Youaregivenanintegerarray nums andtwointegers minK and maxK.A......
  • 用缓存,你缓存对了吗?
    原始代码publicStringselectLevyInvoiceNameString_Cache(StringmerId){List<TMerchantLevyInvoiceTypeVO>merLevyInvoiceTypeList=CacheUtil.getCache("me......
  • 1441. 用栈操作构建数组
    1441.用栈操作构建数组给你一个数组target和一个整数n。每次迭代,需要从 list={1,2,3...,n}中依次读取一个数字。请使用下述操作来构建目标数组targ......