1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

DjangoでAPIのキャッシュ方法をデコレータで実装してみた

Last updated at Posted at 2021-07-06

はじめに

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)
    〜〜〜処理〜〜〜

もし、、、上記みたいに実装しなくても、もうすでにあるよ〜〜〜って知ってる人いたら教えてください!!!

参考にしたやつ
https://docs.djangoproject.com/ja/3.2/topics/cache/

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?