django给视图添加缓存功能

在开发过程中,有些视图只是查询数据,而且查询的数据一般不会变化。例如,做地址模块时,省市县都是不会变的。如果用户每次请求地址视图时,都要执行视图返回数据,会给服务端带来不必要的压力。这时候可以用到缓存。

  • 视图缓存的原理

当第一个用户访问地址视图时,返回所有省市县。如果用redis来做缓存存储的话,那么会以键对的方式把数据保存在redis。键是url,值是数据。(当然,两者都会被编码)。接下来有用户访问地址视图时,会先在redis上找,找到的话直接返回。如果找不到,才会到达视图,执行查询等操作,返回给用户。(同时也继续存储在redis)

  • 使用前的配置

(1)安装视图缓存拓展包

pip install drf-extensions

(2)在settings.py上配置

# drf扩展: 缓存配置, 获取省份和区县接口使用到
REST_FRAMEWORK_EXTENSIONS = {
    # 缓存时间(1小时)
    'DEFAULT_CACHE_RESPONSE_TIMEOUT': 60 * 60,
    # 缓存到哪里 (caches中配置的default)
    'DEFAULT_USE_CACHE': 'default',
}
  • 怎么用

使用方式有两种。

  • 方式一:在类的方法上添加装饰器实现缓存

示例:

class CityView(views.APIView):
    # 如果在使用cache_response装饰器时未指明timeout或者cache参数,则会使用配置文件中的默认配置
    @cache_response(timeout=60*60, cache='default')
    def get(self, request, *args, **kwargs):
        pass
  • 方式二:使用drf-extensions提供的扩展类

1. ListCacheResponseMixin
    用于缓存返回列表数据的视图,与ListModelMixin扩展类配合使用,实际是为list方法添加了cache_response装饰器

2. RetrieveCacheResponseMixin
    用于缓存返回单一数据的视图,与RetrieveModelMixin扩展类配合使用,实际是为retrieve方法添加了cache_response装饰器

3. CacheResponseMixin
    为视图集同时补充List和Retrieve两种缓存,与ListModelMixin和RetrieveModelMixin一起配合使用。

示例:

class AreasViewSet(CacheResponseMixin, ReadOnlyModelViewSet):
    ...
原文地址:https://www.cnblogs.com/chichung/p/9993317.html