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。非常方便