はじめに
python、django勉強始めて2ヶ月くらいなので、スネークケース、キャメルケース適当です!!
それでは、、、
Djangoのキャッシュ方法は下記3つあります。
①「ページごと」キャッシュ
②「API」キャッシュ
③「テンプレート」キャッシュ
で、今回やりたいのは、②「API」キャッシュ。
「@cache_page」が使えると書いてあったけど、ビューキャッシュ(上記①)しかダメっぽい。
@cache('cache_key', 'key_param')
みたいにさ。書いたら自動でキャッシュしてよしなにしてくれるデコレータを探したけど、どこにも情報ない。。。
んで、、、とりあえず、実装してみた。
cacheUtil.py
from django.core.cache import cache
from django.conf import settings
DEFAULT_CACHE_TIMEOUT = settings.CACHES['default']['TIMEOUT']
CACHE_KEY_FORMAT = '{}_{}'
KEY_PARAM = 'k_p'
# 呼び出し元にk_p引数をいれる
# キャッシュがあればキャッシュを取得。なければメソッドを実行してキャッシュして返す。
def api_cache(key, timeout=DEFAULT_CACHE_TIMEOUT):
def _api_cache(func):
def wrapper(*args, **kwargs):
new_key = key_generate(key, kwargs.get(KEY_PARAM))
cache_value = cache.get(new_key)
if not cache_value:
result = func(*args, **kwargs)
cache.set(new_key, result, timeout)
return result
return cache_value
return wrapper
return _api_cache
def key_generate(key, key_param):
if key_param:
return CACHE_KEY_FORMAT.format(key, key_param)
else:
raise ValueError("Cache用の'k_p'引数が未設定です")
上記Utilを使ったキャッシュ方法
キャッシュをしたいdef
# 上記のcacheUtil.pyはutilsというディレクトリに入れてます。
from utils.cacheUtil import api_cache
# 第一引数はキーとして、他の関数と被らないように設定してください。
# timeoutは指定しなかったら、defaultの値が入ります。
@api_cache('get_all_data', timeout=60 * 60 * 24)
def get_all_data(town_cd, k_p):
〜〜〜処理〜〜〜
キャッシュをしたdefを使う場合
town_cd = 'shibuya'
# 呼び出し元が@api_cacheがついたdefを使う場合は、必ずk_pに値を入れる。
# k_pは、キャッシュを持つ時に一意になる値です。
# k_p入れてないとエラーでるようになってます。
hoge = get_all_data(town_cd, k_p=town_cd)
〜〜〜処理〜〜〜
もし、、、上記みたいに実装しなくても、もうすでにあるよ〜〜〜って知ってる人いたら教えてください!!!