django cache_page 装饰器 自定义cache_key

  • 2020 年 3 月 17 日
  • 笔记

位于from django.views.decorators.cache import cache_page的这个cache_page是django提供的缓存页面的方法,首先需要在settings.py中加入配置

CACHES = {      "default": {          "BACKEND": "django_redis.cache.RedisCache",          "LOCATION": 'redis://127.0.0.1:6379/1',          "OPTIONS": {             "CLIENT_CLASS": "django_redis.client.DefaultClient",          }      }  }

也需要安装依赖包django-redis

pip install django-redis

然后在views.py中的方法加入这个装饰器就可以对页面进行缓存了。

@cache_page(60 * 10)  def index(request):      ...

虽然使用很方便,但是这个cache_page生成的key 非常的长,而且不能自定义缓存的key,在使用上带来一些不便。

所以下面介绍如何 让@cache_page支持自定义的key,我们这里不会对django的源码修改。我们自己添加一个utils.py类。写一个类似的@cache_page即可。代码如下:

from django.core.cache import CacheHandler  from django.conf import settings    alias = settings.CACHE_MIDDLEWARE_ALIAS  caches = CacheHandler()  cache = caches[alias]      def cache_page(timeout=-1, cache_key=None):      """      页面缓存      :param cache_key:      :param timeout:      :return:      """        def _deco(view_func):          @wraps(view_func)          def _handler(request, *args, **kw):              key = cache_key              if not key:                  key = "{}://{}{}".format(request.scheme, request.META.get("HTTP_HOST"), request.path)              response = cache.get(key)              if response is None:                  response = view_func(request, *args, **kw)                  cache.set(key, response, timeout)              return response            return _handler        return _deco

使用:

@cache_page(timeout=9999,cache_key='123')  def index(request):     ...

如果默认不指定key,就使用url来作为key。非常方便