11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DjangoAdvent Calendar 2018

Day 22

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

Last updated at Posted at 2018-12-21

#本記事のテーマ

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に投稿していきたいと思いますので、どうぞよろしくお願い致します!

11
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?