Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

本記事のテーマ

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

shonansurvivors
SRE/DevOps/AWS勉強中 | JAWS-UG初心者支部運営メンバー
https://zenn.dev/shonansurvivors
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away