momoto.github.io

HerokuにDjango 1.5.2を展開する

 Herokuが提供するPaaSにウェブアプリケーションフレームワーク Django 1.5.2を展開します。Pythonのバージョンは2.7を使用しています。

1. django-toolbeltをインストールする

 django-toolbeltをインストールするところからはじめていきます。ここまでにPythonとVirtualenvがインストールされている必要があります。

 まず、Python環境をつくるためのディレクトリを用意します。

1
2
$ mkdir {application_root}
$ cd {application_root}/

 virtualenv 1.10.1をつかって、独立したPython環境を作成します。

1
2
3
4
5
6
7
8
$ virtualenv-2.7 venv --distribute

  New python executable in venv/bin/python2
  Also creating executable in venv/bin/python
  Installing Setuptools......................done.
  Installing Pip.............................done.

$ source venv/bin/activate

 pip 1.4.1をつかってdjango-toolbelt 0.0.1をインストールします。

1
2
3
4
(venv) $ pip install django-toolbelt

  Successfully installed django-toolbelt django psycopg2 gunicorn dj-database-url dj-static static
  Cleaning up...

2. Djangoプロジェクトを作成する

 Herokuへ展開するDjangoのプロジェクトを作成していきます。この手順の中で、Herokuのプラットフォームでも動作するようにDjangoの設定を調整する必要があります。

 django-admin.pyをつかってプロジェクトを作成します。

1
(venv) $ django-admin.py startproject {project_name} .

 アプリケーションのルートディレクトリにProcfile、requirements.txt、.gitignoteを用意します。 ProcfileにはHerokuのdynosに実行させるコマンドを宣言します。 requirements.txtには必要なPythonパッケージを記述します。 .gitignoreにはGitで追跡しないファイルを明示します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(venv) $ vi Procfile

  web: gunicorn {project_name}.wsgi

(venv) $ pip freeze > requirements.txt

  Django==1.5.2
  dj-database-url==0.2.2
  dj-static==0.0.5
  django-toolbelt==0.0.1
  gunicorn==17.5
  psycopg2==2.5.1
  static==0.4
  wsgiref==0.1.2

(venv) $ vi .gitignore

  venv
  *.pyc
  staticfiles

 {project_name}/settings.py では、データベースURLやスタティックファイルへのパスを調整する必要があります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Parse database configuration from $DATABASE_URL
import dj_database_url
DATABASES['default'] =  dj_database_url.config()

# Honor the 'X-Forwarded-Proto' header for request.is_secure()
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

# Allow all host headers
ALLOWED_HOSTS = ['*']

# Static asset configuration
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = 'staticfiles'
STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

TEMPLATE_DIRS = (
    os.path.join(BASE_DIR, 'templates'),
)

 同様に、{project_name}/wsgi.py の内容も変更します。

1
2
3
4
from django.core.wsgi import get_wsgi_application
from dj_static import Cling

application = Cling(get_wsgi_application())

3. Herokuへ展開する

 作成したDjangoプロジェクトをHerokuへ展開していきます。GitやHeroku ToolbeltとHerokuユーザアカウントが必要です。

 Gitをつかってローカルリポジトリを作成します。

1
2
3
4
5
6
7
8
9
10
11
12
13
(venv) $ git init

  Initialized empty Git repository in ~/{application_root}/.git/

(venv) $ git add .
(venv) $ git commit -m "Initial commit"

  [master (root-commit) 691c642] Initial commit
   8 files changed, 254 insertions(+)
   create mode 100644 .gitignore
   create mode 100644 Procfile
   create mode 100644 requirements.txt
   ...

 Heroku ToolbeltをつかってHeroku側でアプリケーションを作成します。

1
2
3
4
5
(venv) $ heroku create

  Creating {application_name}... done, stack is cedar
  http://{application_name}.herokuapp.com/ | git@heroku.com:{application_name}.git
  Git remote heroku added

 GitをつかってローカルリポジトリをHerokuプラットフォームへプッシュします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
(venv) $ git push heroku master

-----> Python app detected
-----> No runtime.txt provided; assuming python-2.7.4.
-----> Preparing Python runtime (python-2.7.4)
-----> Installing Distribute (0.6.36)
-----> Installing Pip (1.3.1)
-----> Installing dependencies using Pip (1.3.1)

       Installing collected packages: Django, dj-database-url, dj-static, django-toolbelt, gunicorn, psycopg2, static
       Successfully installed Django dj-database-url dj-static django-toolbelt gunicorn psycopg2 static
         Cleaning up...

-----> Discovering process types
       Procfile declares types -> web

-----> Compiled slug size: 34.3MB
-----> Launching... done, v5
       http://{application_name}.herokuapp.com deployed to Heroku

Welcome to Django

管理サイトを有効化する

 管理サイトを有効化する場合はINSTALLED_APPSdjango.contrib.adminの行をアンコメントします。INSTALLED_APPSは{project_name}/settings.pyに記述されています。

1
2
3
4
5
6
7
8
9
10
11
12
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    'django.contrib.admindocs',
)

 同様に、urlpatternsurl(r'^admin/', include(admin.site.urls))の行をアンコメントします。urlpatternsは{project_name}/urls.pyに記述されています。

1
2
3
4
5
6
7
8
9
10
11
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Uncomment the admin/doc line below to enable admin documentation:
    url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    url(r'^admin/', include(admin.site.urls)),
)

 INSTALLED_APPSを変更してHerokuへプッシュした後は、Herokuプラットフォーム側でpython manage.py syncdbを実行する必要があります。 Herokuプラットフォーム側でコマンドを実行する場合はheroku runをつかいます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(venv) $ heroku run python manage.py syncdb
Running `python manage.py syncdb` attached to terminal... up, run.4816
Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table django_admin_log

You just installed Django's auth system, which means you don't have any superusers defined.
...
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

参考