Django-caching

提供:Dev Guides
移動先:案内検索

ジャンゴ-キャッシング

何かをキャッシュすることは、高価な計算の結果を保存することで、次回必要になったときに実行しないようにします。 以下は、キャッシュがどのように機能するかを説明する擬似コードです-

given a URL, try finding that page in the cache

if the page is in the cache:
   return the cached page
else:
   generate the page
   save the generated page in the cache (for next time)
   return the generated page

Djangoには独自のキャッシングシステムが付属しており、動的ページを保存して、必要なときに再度計算することを回避できます。 Django Cacheフレームワークの良い点は、キャッシュできることです-

  • 特定のビューの出力。
  • テンプレートの一部。
  • サイト全体。

Djangoでキャッシュを使用するには、最初にキャッシュが留まる場所を設定する必要があります。 キャッシュフレームワークにはさまざまな可能性があります-キャッシュはデータベース、ファイルシステム、またはメモリに直接保存できます。 設定はプロジェクトの settings.py ファイルで行われます。

データベースでのキャッシュのセットアップ

プロジェクトのsettings.pyファイルに次を追加するだけです-

CACHES = {
   'default': {
      'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
      'LOCATION': 'my_table_name',
   }
}

これが機能し、設定を完了するには、キャッシュテーブル「my_table_name」を作成する必要があります。 このためには、次のことを行う必要があります-

python manage.py createcachetable

ファイルシステムでのキャッシュのセットアップ

プロジェクトのsettings.pyファイルに次を追加するだけです-

CACHES = {
   'default': {
      'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
      'LOCATION': '/var/tmp/django_cache',
   }
}

メモリ内のキャッシュのセットアップ

これはキャッシュの最も効率的な方法です。これを使用するには、メモリキャッシュ用に選択したPythonバインディングライブラリに応じて、次のオプションのいずれかを使用できます。

CACHES = {
   'default': {
      'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
      'LOCATION': '127.0.0.1:11211',
   }
}

Or

CACHES = {
   'default': {
      'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
      'LOCATION': 'unix:/tmp/memcached.sock',
   }
}

サイト全体のキャッシュ

Djangoでキャッシュを使用する最も簡単な方法は、サイト全体をキャッシュすることです。 これは、プロジェクトのsettings.pyでMIDDLEWARE_CLASSESオプションを編集することにより行われます。 オプションに次を追加する必要があります-

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

ここで順序が重要であることに注意してください。更新はFetchミドルウェアの前に来る必要があります。

その後、同じファイルで、設定する必要があります-

CACHE_MIDDLEWARE_ALIAS – The cache alias to use for storage.
CACHE_MIDDLEWARE_SECONDS – The number of seconds each page should be cached.

ビューをキャッシュする

サイト全体をキャッシュしたくない場合は、特定のビューをキャッシュできます。 これは、Djangoに付属の cache_page デコレーターを使用して行われます。 viewArticles ビューの結果をキャッシュしたいとしましょう-

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)

def viewArticles(request, year, month):
   text = "Displaying articles of : %s/%s"%(year, month)
   return HttpResponse(text)

ご覧のとおり、 cache_page には、ビューの結果をパラメーターとしてキャッシュする秒数がかかります。 上記の例では、結果は15分間キャッシュされます。

-上記のビューがマップされる前に見たように-

urlpatterns = patterns('myapp.views',
   url(r'^articles/(?P<month>\d{2})/(?P<year>\d{4})/', 'viewArticles', name = 'articles'),)

URLはパラメーターを取得しているため、異なる呼び出しはそれぞれ個別にキャッシュされます。 たとえば、/myapp/articles/02/2007へのリクエストは、/myapp/articles/03/2008に個別にキャッシュされます。

ビューのキャッシュは、url.pyファイルで直接行うこともできます。 その後、次の結果は上記と同じになります。 myapp/url.pyファイルを編集して、関連するマップされたURL(上記)を変更します-

urlpatterns = patterns('myapp.views',
   url(r'^articles/(?P<month>\d{2})/(?P<year>\d{4})/',
   cache_page(60 * 15)('viewArticles'), name = 'articles'),)

そして、もちろん、myapp/views.pyでは不要になりました。

テンプレートフラグメントのキャッシュ

テンプレートの一部をキャッシュすることもできます。これは cache タグを使用して行われます。 hellol テンプレートを見てみましょう-

{% extends "main_templatel" %}
{% block title %}My Hello Page{% endblock %}
{% block content %}

Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}

the first day of month.
{% elif today == 30 %}

the last day of month.
{% else %}

I don't know.
{%endif%}

<p>
   {% for day in days_of_week %}
   {{day}}
</p>

{% endfor %}
{% endblock %}

コンテンツブロックをキャッシュするには、テンプレートが次のようになります-

{% load cache %}
{% extends "main_templatel" %}
{% block title %}My Hello Page{% endblock %}
{% cache 500 content %}
{% block content %}

Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}

the first day of month.
{% elif today == 30 %}

the last day of month.
{% else %}

I don't know.
{%endif%}

<p>
   {% for day in days_of_week %}
   {{day}}
</p>

{% endfor %}
{% endblock %}
{% endcache %}

上記のように、キャッシュタグには2つのパラメーターがあります。ブロックをキャッシュする時間(秒単位)とキャッシュフラグメントに指定する名前です。