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