在开发过程中,有些视图只是查询数据,而且查询的数据一般不会变化。例如,做地址模块时,省市县都是不会变的。如果用户每次请求地址视图时,都要执行视图返回数据,会给服务端带来不必要的压力。这时候可以用到缓存。
-
视图缓存的原理
当第一个用户访问地址视图时,返回所有省市县。如果用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): ...