Top / Programming / Python / Django TIPS / キャッシュを使う

キャッシュを使う

Djangoのキャッシュ機能は、キャッシュする範囲として次の方法を使用できます。

サイト単位のキャッシュを行う

サイト単位のキャッシュでは、GETまたはPOSTパラメータをもたない全てのページをキャッシュします。

設定ファイルを編集してキャッシュ機能の有効化します。

settings.pyのMIDDLEWARE_CLASSESを編集します。

MIDDLEWARE_CLASSESの先頭に'django.middleware.cache.UpdateCacheMiddleware'を追加し、 最後に'django.middleware.cache.FetchFromCacheMiddleware'を追加します。

MIDDLEWARE_CLASSES = (
    'django.middleware.cache.UpdateCacheMiddleware',
    …
    'django.middleware.common.CommonMiddleware',
    …
    'django.middleware.cache.FetchFromCacheMiddleware',
)

キャッシュ時間の設定

settings.pyのCACHE_MIDDLEWARE_SECONDSにキャッシュ時間を秒単位で設定します。
省略した場合のデフォルト値は600です。

#各ページのキャッシュ時間を秒単位で指定
CACHE_MIDDLEWARE_SECONDS = 60 * 60

キャッシュキープレフィクスの設定

複数のサイト間でキャッシュを共有する場合、キャッシュのキー衝突を防ぐ文字列をsettings.pyのCACHE_MIDDLEWARE_KEY_PREFIXに指定します。
キー衝突を気にする必要がない場合は設定する必要はありません。
省略した場合のデフォルト値は''(空文字列)です。

CACHE_MIDDLEWARE_KEY_PREFIX = 'bbs'

匿名のリクエストだけキャッシュする

settins.pyのCACHE_MIDDLEWARE_ANONYMOUS_ONLYをTrueに設定すると、匿名のリクエスト(ログインユーザ以外からのリクエスト)だけをキャッシュします。
この機能を使用する場合は、AuthenticationMiddlewareを有効にする必要があります。

CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True

ビュー単位のキャッシュを行う

個々のビューの出力をキャッシュします。

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)
def index(request):
    …

cache_pageの引数には、キャッシュ時間を秒単位で指定します。

urls.pyのurlpatternsを設定するときに、登録することもできます。

import bbs.views
urlpatterns = patterns('',
    …
    ('^index/$', cache_page(myapp.views.index)),
)

テンプレートの部品単位のキャッシュを行う

テンプレートの一部分だけをキャッシュします。

{% load cache %}
{% cache キャッシュの有効期限 キャッシュ名 %}
  キャッシュする内容
{% endcache %}

chacheタグの最初の引数には、キャッシュの有効期限を秒単位で指定します。
2番目の引数にはキャッシュされた部分に付ける名前を指定します。
3番目の引数を指定すると、変数に応じてキャッシュされます。

例:テンプレートの部品単位のキャッシュを行う

{% load cache %}

  <h2>ここはキャッシュしません</h2>
  <p>{{ now }}</p>

{% cache 500 %}

  <h2>ここはキャッシュします</h2>
  <p>{{ now }}</p>

{% endcache %}

例:キャッシュの有効期限を500秒、キャッシュ名をcurrent_time_cacheとする

{% load cache %}

{% cache 500 current_time_cache %}
  <h2>ここはキャッシュします</h2>
  <p>{{ now }}</p>
{% endcache %}

キャッシュの有効期限は整数値のテンプレート変数でも指定できます。

{% load cache %}

{% cache my_timeout sidebar %}
  …
{% endcache %}

例:ユーザーごとに個別のキャッシュをする

{% load cache %}

{% cache 500 sidebar request.user.username %}
  …
{% endcache %}

低水準のキャッシュAPI

オブジェクトを好きな粒度でキャッシュに保存できます。
データベースの変更を契機にキャッシュを更新するなど、きめ細かいキャッシュの制御を行うことができます。

django.core.cacheモジュールのcacheオブジェクトを使用します。

from django.core.cache import cache

キャッシュに登録する

キャッシュに登録するときはcache.set(key, value, timeout_seconds)を使用します。

from django.core.cache import cache
cache.set(key, value, timeout_seconds)

キャッシュを取得するときはcache.get(key, default=None, timeout_seconds=timeout)を使用します。
キャッシュがなければdefaultを返します。
timeout_secondsのデフォルト値はCACHE_BACKEND設定のtimeout引数の値になります。

from django.core.cache import cache
value = cache.get(key)

キャッシュを削除するときはcache.delete(key)を使用します。

from django.core.cache import cache
cache.delete(key)

from django.core.cache import cache
cache.get('my_key') #=> None
cache.get('my_key', 'hey') #=> 'hey'
cache.set('my_key', 'hello, world!', 30)
cache.get('my_key') #=> 'hello, world!'
cache.delete('my_key')
cache.get('my_key') #=> None

cache.add(key, value, timeout_seconds)はキャッシュ辞書上にキーが存在しない場合のみ、値を登録します。
キーが存在する場合は、キャッシュを更新しません。
cache.addはcache.setと同じ引数をとります。

from django.core.cache import cache
cache.get('my_key') #=> None

cache.add('my_key', 'hey')
cache.get('my_key') #=> 'hey'

cache.add('my_key', 'hello, world!')
cache.get('my_key') #=> 'hey'

cache.get_mary()は指定したキーのものの辞書を返します。

cache.set('a', 1)
cache.set('b', 2)
cache.set('c', 3)
cache.get_many(['a', 'b', 'c']) #=> {'a': 1, 'b': 2, 'c': 3}

関連項目

更新履歴