Django私有化缓存实现
私有化缓存场景和意义?
场景:不同用户访问同一接口,可能因为权限不同等需要返回不同内容,而缓存应该如何实现?于是笔者想要打造一个Django的缓存组件,它应具有以下特性:
兼容Django自有缓存系统,配置简单,使用方便。
支持'GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'PATCH'主流请求方式,支持form_data,json等数据格式.
支持自定义缓存过期时间。
支持依靠请求头内容区分缓存,如headers中携带jwt token携带用户信息,以及headers中任何可能用来鉴权的内容。
支持依据请求体进行区分,实现同一接口不同参数不同缓存内容。
支持依据请求体中不同参数进行区分,可以指定请求体中的一个或多个参数。
一:安装
pip install django-api-cache
二:在此使用redis做缓存,也可使用django的其他缓存
pip install django-redis
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
三:代码中无需任何改造,直接使用,详细参数说明可见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中,同时以装饰器的方法提供使用。
欢迎评论或提出宝贵意见。