天天看點

django cache_page 裝飾器 自定義cache_key

位于

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。非常友善