写点什么

打造 Django 私有化缓存组件 django-api-cache

用户头像
pygodnet
关注
发布于: 2020 年 12 月 04 日
打造Django私有化缓存组件django-api-cache

一:什么是私有化缓存及使用场景?

缓存,在开发中经常使用,如缓存页面等,而对于接口而言,不同用户(或使用不同参数)访问同一接口,因权限不同等需要返回不同内容,在这种情况下,如何利用缓存的优良特性,又能对不同用户数据做出妥善处理,于是笔者想要打造一个 Django 的私有化缓存组件,他应至少具有如下特性:


  1. 作为组件使用,兼容 Django 自有缓存系统,配置简单,使用方便。

  2. 支持'GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'PATCH'主流请求方式及 form_data,json 等数据格式的接口缓存,支持 render 等页面数据缓存。

  3. 支持自定义缓存过期时间。

  4. 支持依靠请求头内容区分缓存,如 headers 中携带 jwt token 携带用户信息,以及 headers 中任何可能用来鉴权的内容。

  5. 支持依据请求体进行区分,实现同一接口不同参数不同缓存内容。

  6. 支持依据请求体中不同参数进行区分,可以指定请求体中的一个或多个参数。

二:这些特性的实现逻辑?

1.如何兼容 django 缓存系统?

基于 django cache_page 进行改造,支持数据库缓存,文件缓存,memcache 等。

2.对多种请求方式及页面和接口缓存的支持?

从请求体中提取请求方式,不同请求体进行不同方式的数据提取。同时缓存只对返回体进行缓存,不区分接口缓存或页面缓存。

3.自定义缓存过期时间?

增加配置项,不同缓存指定不同缓存过期时间。

4.依据请求头进行区分?

指定请求头参数,并将此参数加入缓存 key 的名称,如将用户信息放到 headers 中的 token,即可实现对用户的区分。

5.依据请求体进行区分?

同一接口不同请求参数,做相应的缓存,将请求体进行 hash 处理,加入缓存 key 的名称。

6,指定一个或多个请求参数?

与 5 类似,但粒度至请求体中的一个或多个参数,不同参数 name 拼接处理加入缓存 key 的名称。

三:django-api-cache 使用方式?

项目地址:https://github.com/pygodnet/django-api-cache,已上传 pypi 源

1.安装:pip 进行安装


pip install django-api-cache
复制代码

2.配置:在此使用 redis 做缓存,也可使用 django 的其他缓存

pip install django-redis
# settings.py 中加入如下配置CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/1", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", # "PASSWORD": "mysecret" } }}
复制代码

3.使用:代码中无需任何改造,直接使用,详细参数说明可见 github 说明。

from django_api_cache import api_cache
# 类视图class TestViewTwo(View): @method_decorator(api_cache(timeout=30,header_key='Authorization',body_data=False,param_data=['aaa'])) def post(self,request):
# 函数视图@api_cache(timeout=30,header_key='Authorization',body_data=False,param_data=['aaa'])def test_demo(request):
复制代码

实测缓存效果较好,后续将进行不断更新,欢迎进行批评指正


发布于: 2020 年 12 月 04 日阅读数: 120
用户头像

pygodnet

关注

python学习交流公众号Hello Python 2020.03.23 加入

多年python开发,从事web,爬虫项目开发及前沿技术研究

评论 (2 条评论)

发布
用户头像
架构师月刊,牛批啊,关注了
2020 年 12 月 04 日 16:42
回复
谢谢,欢迎批评指正
2020 年 12 月 04 日 16:47
回复
没有更多了
打造Django私有化缓存组件django-api-cache