Edited at
DjangoDay 22

Djangoのキャッシュ機能をHerokuで使う Memcached Cloud編


本記事のテーマ

Djangoのキャッシュ機能で、HerokuのMemcached Cloudを使うための設定方法を説明します。

というのも、Heroku Dev Center(Herokuの開発者コミュニティ)に記載の通りの設定方法だとエラーになってしまい、初心者のつまづきポイントになりそうなためです。


環境


  • Python 3.7.0

  • Django 2.1

  • django-bmemcached 0.2.3

  • python-binary-memcached 0.28.0


設定方法


1. HerokuにMemcached Cloudを導入する


1.1. コマンドで導入する場合

heroku addons:create memcachedcloud:30を実行します。

30の部分はサイズ(MB)で、30MBまでは無料です。

$ heroku addons:create memcachedcloud:30

Creating memcachedcloud:30 on ⬢ (Herokuアプリ名)... free
Created memcachedcloud-contoured-23352 as MEMCACHEDCLOUD_PASSWORD, MEMCACHEDCLOUD_SERVERS, MEMCACHEDCLOUD_USERNAME
Use heroku addons:docs memcachedcloud to view documentation


1.2. 管理画面で導入する場合

ResoucesタブのAdd-onsからMemcached Cloudを検索して選択します。

スクリーンショット 2018-12-14 17.20.01.png

Planについては、30MBであれば無料(Free)です。

Planを選んだら、続いてProvisionを選択します。

スクリーンショット 2018-12-14 17.21.19.png


2. ローカルの開発環境へdjango-bmemcachedをインストールする

HerokuでMemcachedを使うため、django-bmemcachedをインストールします。

(venv) $ pip install django-bmemcached

すると、以下のパッケージがインストールされます。

(venv) $ pip list

Package Version
----------------------- ---------
(略)
django-bmemcached 0.2.3 # 追加
python-binary-memcached 0.28.0 # 追加
typing 3.6.6 # 追加
uhashring 1.1 # 追加
(略)


3. それらパッケージをrequirements.txtに反映させる

(venv) $ pip freeze > requirements.txt


4. settings.pyを編集する


4.1. Heroku用の設定

既にローカルの開発環境でMemcachedを使用中であれば、settings.pyのCACHESは以下のような設定になっているかと思います。


settings.py(変更前)

CACHES = {

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

これをHeroku用に以下のように変更します。


settings.py(変更後)

import os

# Heroku Dev Centerでは以下の記載があるが、不要
# import urlparse
# import json 

CACHES = {
'default': {
'BACKEND': 'django_bmemcached.memcached.BMemcached',
# 'LOCATION': os.environ.get('MEMCACHEDCLOUD_SERVERS').split(','),
# と、Heroku Dev Centerでは記載されているが
# AttributeError: 'NoneType' object has no attribute 'split'
# のエラーになるため、以下のように記述する。LOCATIONはリスト形式で設定すれば良い。
'LOCATION': [os.environ.get('MEMCACHEDCLOUD_SERVERS')],
'OPTIONS': {
'username': os.environ.get('MEMCACHEDCLOUD_USERNAME'),
'password': os.environ.get('MEMCACHEDCLOUD_PASSWORD')
}
}
}


なお、MEMCACHEDCLOUD_SERVERS, MEMCACHEDCLOUD_USERNAME, MEMCACHEDCLOUD_PASSWORDといった環境変数は、さきほどMemcached Cloudを導入した時点でHerokuに設定済みとなっています。

heroku configコマンドか、Herokuの管理画面のsettingsタブ > Reveal Config Varsを選択することで確認できます。


4.2. ローカルの開発環境用の設定

ローカルの開発環境のDjangoの設定を、もし以下のようにlocal_settings.pyで管理しているのであれば・・・


settings.py

try:

from .local_settings import *
except ImportError:
pass

local_settings.pyに以下を追記します。


local_settings.py(変更後)

CACHES = {

'default': {
'BACKEND': 'django_bmemcached.memcached.BMemcached',
'LOCATION': '127.0.0.1:11211',
}
}


5. 設定完了

以上で、HerokuでMemcachedを使う準備ができました。

あとはHerokuへDjangoアプリをデプロイしてください。


キャッシュする対象の指定方法について

キャッシュする対象(ビューやテンプレートなど)の指定に関しては、様々な方法があります。

naritoさんのブログや、Django Advent Calendar 2018の14日目の記事であるshinyorkeさんのブログに詳しく記載されているので、そちらを参考にしていただければと思います。

私の過去のQiitaの記事でもurls.pyでcache_page関数を使う一例を記載しています。


最後に少し自己紹介

ここまでお読みいただき、ありがとうございました。

私、やんばる(@shonansurvivors)は今年2018年の5月ごろからPythonを学び始め、その勉強の過程やDjangoで作ったWebサービスについてブログに投稿したところ、非常に多くの方に読んでいただくことができました。

その後、ここ最近はそのサービスのレスポンス向上に取り組んできたため、そこで学んだDjangoのキャッシュ機能について、今回のAdvent Calendarのテーマとさせていただきました。

今後もPython、Djangoを学ぶ中で得た知識をQiitaに投稿していきたいと思いますので、どうぞよろしくお願い致します!