Django-キャッシング

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

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.

ビューのキャッシュ

サイト全体をキャッシュしたくない場合は、特定のビューをキャッシュできます。これは、cache_pageDjangoに付属のデコレータ。結果をキャッシュしたいとしましょう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分間キャッシュされます。

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

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鬼ごっこ。私たちを取りましょうhello.html テンプレート-

{% extends "main_template.html" %}
{% 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_template.html" %}
{% 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つのパラメーターを取ります。ブロックをキャッシュする時間(秒単位)と、キャッシュフラグメントに付けられる名前です。