Django-caching
ジャンゴ-キャッシング
何かをキャッシュすることは、高価な計算の結果を保存することで、次回必要になったときに実行しないようにします。 以下は、キャッシュがどのように機能するかを説明する擬似コードです-
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つのパラメーターがあります。ブロックをキャッシュする時間(秒単位)とキャッシュフラグメントに指定する名前です。