对于经常被查询使用而且不怎么变化的数据, 建议对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的开发使用技巧
- 安装依赖包
pip install drf-extensions
- 直接添加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方法上。
- 使用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中。
- ListCacheResponseMixin
用于缓存返回列表数据的视图,与ListModelMixin扩展类配合使用,实际是为list方法添加了cache_response装饰器
是一个mix-in类,用于为Django REST Framework中的列表视图提供缓存响应(cache response)功能。使用该mix-in类可以在视图中缓存响应数据,以提高性能和响应速度。
提供缓存列表查询结果的功能。
- RetrieveCacheResponseMixin
用于缓存返回单一数据的视图,与RetrieveModelMixin扩展类配合使用,实际是为retrieve方法添加了cache_response装饰器
是一个mix-in类,用于为Django REST Framework中的单个资源视图提供缓存响应(cache response)功能。类似于ListCacheResponseMixin,使用该mix-in类可以在视图中缓存响应数据,以提高性能和响应速度。
提供缓存单个查询结果的功能。
- CacheResponseMixin
为视图集同时补充List和Retrieve两种缓存,与ListModelMixin和RetrieveModelMixin一起配合使用。
是一个mix-in类,用于为Django REST Framework中的视图提供缓存响应(cache response)功能。该类可以用于任何类型的REST框架视图,包括列表视图和单个资源视图。使用该mix-in类可以在视图中缓存响应数据,以提高性能和响应速度。
提供缓存视图函数响应结果的功能。
- BaseCacheResponseMixin
是一个基础mix-in类,用于为Django REST Framework中的视图提供缓存响应(cache response)功能。该类定义了一些基本的属性和方法,可以在其他mix-in类中作为基类使用。使用该mix-in类可以为视图提供更灵活和扩展性的缓存响应功能。
提供缓存响应结果的基础功能。
最常用的是CacheResponseMixin,它对单个对象或对象列表都进行缓存,使用示例如下所示:
输入才有输出,吸收才能吐纳。——码字不易
微信公众号搜索【CTO Plus】关注后,获取更多,我们一起学习交流。