Django でキャッシュを実装します。キャッシュと一言で言っても様々なやり方がありますが、例えば、キャッシュする対象については、以下のものがあると思います。
- サイト全部
- 1ページ全部
- HTML の一部
- 関数
- 変数
さらに、キャッシュ保存先については、以下のものがあると思います。
- メモリ
- ファイル
- Memcache
- Redis
- その他
Django は、これらを柔軟に実装できるための仕組みを用意しています。
今回は、関数のキャッシュをファイルに保存する実装をしてみたいと思います。
Contents
環境とバージョン
- CentOS 7.5.1804
- Python 3.6.4
- Django 2.1.1
インストール
それでは、環境を作っていきます。
Python
$ sudo yum install https://centos7.iuscommunity.org/ius-release.rpm $ sudo yum install python36u python36u-libs python36u-devel python36u-pip
CentOS 7 に Python 3.6 をインストールします。
Django
$ sudo pip install --upgrade django
次に、pip で Django をインストールします。
実装
Python と Django をインストールしたら、次は実装に入ります。
プロジェクトとアプリケーションの作成
$ django-admin startproject dj_cache $ cd dj_cache/ $ python3.6 manage.py startapp myapp
まず、Django のコマンドを使って、プロジェクトとアプリケーションの雛形を作成します。
settings.py
ALLOWED_HOSTS = ['*'] INSTALLED_APPS = [ ... 'myapp.apps.MyappConfig', ] CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tmp/django_cache', } }
雛形で作成された settings.py を編集していきます。
キャッシュ保存先の指定 CACHES
settings.py の CACHES にキャッシュの保存先を定義します。今回は、ファイルキャッシュを使用しますので、BACKEND に FileBasedCache を設定し、LOCATION にキャッシュデータの保存先を設定します。
views.py
from django.shortcuts import render from django.views.decorators.cache import cache_page @cache_page(60 * 15) def index(request): print('=== No cache!! ===') return render(request, 'myapp/index.html')
views.py です。index 関数は、キャッシュを使わない時と全く同じ実装です。キャッシュを全く意識する必要がありません。
関数をキャッシュ cache_page デコレータ
関数をキャッシュしたい場合は、cache_page デコレータを使用します。
このデコレータは、引数が1つ必須になっていて、キャッシュの有効期限を秒で指定します。上記コードでは、60 * 15 を指定しているので、15 分間キャッシュが有効になります。
urls.py
from django.urls import path from myapp.views import index urlpatterns = [ path('', index), ]
urls.py です。
index.html
<html> <head> <title>Django キャッシュを実装する</title> </head> <body> <h1>Django キャッシュを実装する</h1> </body> </html>
HTML を適当に作成しました。
動作確認
それでは、動作確認です。
デバッグサーバの起動
$ python3.6 runserver 0.0.0.0:8000
まず、Django のデバッグサーバの runserver を起動します。
マイグレーションしろと警告が出るかもしれませんが、今回は必要ないので無視します。
ブラウザで2回アクセス
=== No cache!! === [19/Sep/2018 11:44:28] "GET / HTTP/1.1" 200 167 [19/Sep/2018 11:44:39] "GET / HTTP/1.1" 200 167
runserver を起動させている状態で、ブラウザで2回アクセスすると、上記のように、views.py の print 文が1回出力され、2回目のアクセスはキャッシュが効いているので、print 関数が実行されていないことが確認できると思います。
キャッシュの削除について
$ rm -rf /var/tmp/django_cache
キャッシュは、そのままにしておいても消えますが、今回は、ファイルキャッシュなので、ファイルを rm しても消すことができます。
まとめ
Django でキャッシュを実装しました。
私は、とりあえず手軽にキャッシュしたい時、ファイルキャッシュバックエンドを使います。手軽さでいうと、ローカルメモリバックエンドもあるのですが、プロセスでメモリ空間が別れてしまうので、あまり好きではありません。
本格的に使う場合は、Redis を使います。
手軽に柔軟に使えるので、皆さんもぜひ一度試してください。