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} # 配置连接池
        }
    }
}