11、DRF实战总结:使用cache_page和第三方库drf-extensions进行缓存(附源码)

对于经常被查询使用而且不怎么变化的数据, 建议对Django REST Framework(DRF)的响应数据进行缓存, 这样可以避免重复数据库查询, 大大加快响应时间。

DRF支持两种数据缓存方式:

1. Django的原生cache_page装饰器;

2. drf-extensions这个第三方库提供的CacheResponseMixin的Mixin类。

原生cache_page装饰器

cache_page装饰器是Django的一个视图缓存装饰器,其作用是缓存视图返回的页面,在下一次请求时直接返回缓存的结果而不需要重新执行视图函数。它可以显著提高 Django 应用程序的性能,减少服务器负载,加速网页响应速度。

cache_page装饰器的功能特性包括:

- 可以设置缓存的时长,缓存时间可以是一个固定的时间段,也可以是一个时间戳;

- 可以设置针对不同的 HTTP 请求方法进行缓存或不缓存,比如 GET、POST、PUT 等;

- 可以设置是否根据某些请求参数来进行缓存,而不是全局缓存。比如对于搜索页面,可以根据搜索关键字来缓存页面,而不是针对所有请求进行缓存。

使用Django提供的method_decorator装饰器,可以将普通装饰器比如cache_page应用于类视图里。cache_page可以指定缓存时间(单位秒)。

注意:cache_page只能缓存GET和HEAD请求,并返回200的状态码。

使用drf-extensions第三方库

drf-extensions是一个第三方包,提供了许多扩展功能,如:自动生成文档、过滤器、缓存、排序、限制访问频率等。

具体作用:

- 简化REST API开发流程

- 提高API的易用性和可维护性

- 实现常用功能

功能特性:

- 自动生成文档

- 过滤器

- 缓存

- 排序

- 限制访问频率

- 参数验证和转换器

GitHub地址:https://github.com/chibisov/drf-extensions

扩展阅读

Django-extensions是 Django 的扩展应用,它提供了许多有用的工具和命令行工具,帮助 Django 开发者更高效地进行开发和调试。它的作用包括:

- 提供了更多的Django命令,比如导出数据库、生成数据模型文档、查看URL路由表等;

- 提供了一些有用的Django插件,比如shell_plus插件可以在Shell中自动导入项目的所有模块;

- 提供了一些有用的Django工具,比如graph_models可以将项目的数据模型转换成UML图。

Django-extensions的具体详细安装使用方法(如:命令扩展,字段扩展和模型扩展)参考:Django进阶:第三方库Django-extensions的开发使用技巧

  1. 安装依赖包

pip install drf-extensions

  1. 直接添加cache_response装饰器

drf-extensions提供的cache_response装饰器可以直接应用于get方法上,而无需使用method_decorator进行转换。

 
 

cache_response装饰器可以接收两个参数, 一个为缓存时间,一个为默认缓存后端名字,如下所示:

  • @cache_response(timeout=60*60, cache='default')

如果不设置参数,可以在settings.py进行默认配置:

注意:cache_response装饰器既可以装饰在类视图中的get方法上,也可以装饰在REST framework扩展类提供的list或retrieve方法上。

  1. 使用drf-extensions提供的扩展类

drf-extensions扩展Mixin类是 DRF(Django Rest Framework) 扩展中的一种混入类,可以帮助我们将一些通用功能重用在多个接口中。它的作用包括:

- 提供了一些通用的视图方法,比如缓存Mixin、下拉刷新Mixin等;

- 可以扩展DRF的serializer类和response类,为我们提供更加灵活的序列化和响应方式;

- 提供了一些有用的工具类,比如自动进行API版本控制、为API接口添加Swagger文档等。

drf-extensions还提供了3个常用的扩展Mixin类,位于rest_framework_extensions.cache.mixins中。

  1. ListCacheResponseMixin

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

是一个mix-in类,用于为Django REST Framework中的列表视图提供缓存响应(cache response)功能。使用该mix-in类可以在视图中缓存响应数据,以提高性能和响应速度。

提供缓存列表查询结果的功能。

  1. RetrieveCacheResponseMixin

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

是一个mix-in类,用于为Django REST Framework中的单个资源视图提供缓存响应(cache response)功能。类似于ListCacheResponseMixin,使用该mix-in类可以在视图中缓存响应数据,以提高性能和响应速度。

提供缓存单个查询结果的功能。

  1. CacheResponseMixin

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

是一个mix-in类,用于为Django REST Framework中的视图提供缓存响应(cache response)功能。该类可以用于任何类型的REST框架视图,包括列表视图和单个资源视图。使用该mix-in类可以在视图中缓存响应数据,以提高性能和响应速度。

提供缓存视图函数响应结果的功能。

  1. BaseCacheResponseMixin

是一个基础mix-in类,用于为Django REST Framework中的视图提供缓存响应(cache response)功能。该类定义了一些基本的属性和方法,可以在其他mix-in类中作为基类使用。使用该mix-in类可以为视图提供更灵活和扩展性的缓存响应功能。

提供缓存响应结果的基础功能。

最常用的是CacheResponseMixin,它对单个对象或对象列表都进行缓存,使用示例如下所示:

 
 

输入才有输出,吸收才能吐纳。——码字不易


微信公众号搜索【CTO Plus】关注后,获取更多,我们一起学习交流。


猜你喜欢

转载自blog.csdn.net/zhouruifu2015/article/details/130023827