vlambda博客
学习文章列表

Django私有化缓存实现

  私有化缓存场景和意义?

  场景:不同用户访问同一接口,可能因为权限不同等需要返回不同内容,而缓存应该如何实现?于是笔者想要打造一个Django的缓存组件,它应具有以下特性:

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

  2. 支持'GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'PATCH'主流请求方式,支持form_data,json等数据格式.

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

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

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

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

一:安装

pip install django-api-cache

二:在此使用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" } }}

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

1.类视图:

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): name = request.META.get('HTTP_AUTHORIZATION')```

2.函数视图:

from django_api_cache import api_cache
@api_cache(timeout=30,header_key='Authorization',body_data=False,param_data=['aaa'])def test_demo(request):

   实测缓存效果很好,

  实现逻辑:将需要识别的参数,key_prefix, url, header_key, body_data, param_data等,经过处理加入缓存的key中,同时以装饰器的方法提供使用。

  欢迎评论或提出宝贵意见。