Skip to content
shunter1112 edited this page Aug 11, 2013 · 1 revision

このチュートリアルはHerokuにデプロイされる、Postgresデータベースを使ったPython/Djangoアプリケーションを扱って行きます。他のPythonのアプリケーションについてはGetting Started with Python on Herokuを確認してください。Herokuを使ったアプリケーションの開発や設計の仕方に関する一般的な情報は、Architecting Applications for Herokuを確認してください。

もしHerokuにおけるPythonについて質問がある場合、[HerokuのPythonフォーラム](https://discussion.heroku.com/category/python)で議論することを検討してみてください。HerokuとコミュニティベースであるPythonのエキスパートの両方が利用可能です。

事前準備/前提条件

Virtualenvの中でのDjangoアプリケーションをはじめよう

始めに、私たちのプロジェクトのために、空のトップレベルディレクトリを作ります :

:::term
$ mkdir hellodjango && cd hellodjango
最新版のvirtualenvのリリースを使うようにしてください。もし、Ubuntuと一緒になっているバージョンを使おうとする場合、`--no-site-packages` フラグを追加する必要があるでしょう。

次にPython Virtualenv(v0.7)を作ります :

:::term
$ virtualenv venv --distribute
New python executable in venv/bin/python
Installing distribute...............done.
Installing pip...............done.

新しいvirtualenvを作るために、これをアクティベートする必要があります。(あなたのアプリケーションを実行したいと思っているそれぞれのターミナルのセッションごとに、wirtualenvの環境を用意する必要があります)

WIndowsユーザーは同じ効果を得るために、`venv\Scripts\activate.bat`を実行することができます
:::term
$ source venv/bin/activate

次に、私たちのアプリケーションの依存ファイルをpipを使ってインストールします。今回は、必要なパッケージが全て含まれているdjango-toolbeltをインストールします。

  • Django (Webフレームワーク)
  • Gunicorn (WSGIサーバ)
  • dj-database-url (Django設定ヘルパー)
  • dj-static (Djangoの静的なファイルサーバ)

From your virtualenv:

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

これで、作業をするためのきれいなPythonの環境を手に入れました。シンプルなDjangoアプリケーションを作りましょう :

`.` で終わる事を忘れないでください。これはDjangoに、新しいサブディレクトリの代わりに、現在のディレクトリの中に生成物を配置することを教えています
:::term
$ django-admin.py startproject hellodjango .

Procfileへのプロセスタイプの宣言

アプリケーションのルートディレクトリにあるテキストファイルであるProcfileを使って、Web Dynoを開始させるために何のコマンドを実行するべきかを明示的に宣言します。この場合は、Gunicornをいくつかの引数と共にを実行する必要があります。

これは私たちのアプリケーションのためのProcfileです。これはProcfileという名前で、プロジェクトのルートディレクトリに存在している必要があります :

Procfile

:::term
web: gunicorn hellodjango.wsgi

これでForeman を使って、ローカルでProcfileを使う事が出来るようになりました。(Toolbeltの一部としてインストールされています) :

:::term
$ foreman start
2013-04-03 16:11:22 [8469] [INFO] Starting gunicorn 0.17.2
2013-04-03 16:11:22 [8469] [INFO] Listening at: http://127.0.0.1:8000 (8469)

curlやブラウザで適切に動いているかを確認した上で、Ctrl-Cで終了します。

Pipの依存ファイルの明示

HerokuはPythonアプリケーションをリポジトリのルートディレクトリにあるrequirements.txtファイルによって判断します。このシンプルなフォーマットはほとんどのPythonのプロジェクトに置いて、アプリケーションが必要としている外部のPythonモジュールを明示するために使われます。

Pipはpip freezeという、私たちのためのこのファイルを生成してくれる素敵なコマンドを持っています :

:::term
$ pip freeze > requirements.txt

requirements.txt

Django==1.5.1
dj-database-url==0.2.1
dj-static==0.0.5
gunicorn==17.5
psycopg2==2.5.1
static==0.4

Pipはまた、進んだ依存ファイル管理にも使われます。Pipを使ったPythonの依存ファイルをみて、更に学習してみてください。

Djangoの設定

次に、Heroku's Postgres データベースを含んだ、Herokuの環境向けのアプリケーションの設定をして行きましょう。dj-database-urlモジュールはDATABASE_URLenvironment variableの値をパースし、Djangoが理解できる形に変換します。

'dj-database-url'は必要なファイルの中にあります。以下のコードをsettings.pyファイルの最後に追加してください :

settings.py

:::python
# 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'),
)

これらの設定が有効な状態で、静的なファイルをプロダクション環境で使うために、wsgi.pyに以下のコードを追加します :

wsgi.py

:::python
from django.core.wsgi import get_wsgi_application
from dj_static import Cling

application = Cling(get_wsgi_application())

Gitへのあなたのアプリケーションの格納

アプリケーションが書き終わり、テストが完了している今、私たちはGitのリポジトリにこのプロジェクトを格納する必要があります。

現在のディレクトリには余分なファイルがたくさん含まれているため、.gitignoreファイルをつかってこれらのファイルを無視するようにリポジトリを設定したいと思います :

GitHub は素晴らしい[Python gitignore file](https://github.com/github/gitignore/blob/master/Python.gitignore)を提供しており、 これは[システム横断的にインストール可能です](https://github.com/github/gitignore#readme)。

.gitignore

venv
*.pyc
staticfiles

次に、新しいGitリポジトリを作り、私たちの変更を保存します。

:::term
$ git init
Initialized empty Git repository in /Users/kreitz/hellodjango/.git/
$ git add .
$ git commit -m "my django app"
[master (root-commit) 2943412] my django app
 7 files changed, 230 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 Procfile
 create mode 100644 hellodjango/__init__.py
 create mode 100644 hellodjango/settings.py
 create mode 100644 hellodjango/urls.py
 create mode 100644 hellodjango/wsgi.py
 create mode 100644 manage.py
 create mode 100644 requirements.txt

Herokuへのデプロイ

次のステップはアプリケーションのリポジトリをHerokuにプッシュすることです。始めに、私たちはHerokuにプッシュする場所を用意する必要があります。heroku createコマンドでこれが可能です :

:::term
$ heroku create
Creating simple-spring-9999... done, stack is cedar
http://simple-spring-9999.herokuapp.com/ | git@heroku.com:simple-spring-9999.git
Git remote heroku added

これは自動的に私たちのアプリケーションのためのHerokuのリモート(git@heroku.com:simple-spring-9999.git)を私たちのリポジトリに追加してくれます。今私たちは、アプリケーションをデプロイするために、シンプルであるgit pushを叩くことができます。

:::term
$ git push heroku master
Counting objects: 11, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (9/9), done.
Writing objects: 100% (11/11), 4.01 KiB, done.
Total 11 (delta 0), reused 0 (delta 0)
-----> 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)
       Downloading/unpacking Django==1.5 (from -r requirements.txt (line 1))
       ...
       Successfully installed Django psycopg2 gunicorn dj-database-url dj-static static
       Cleaning up...
-----> Collecting static files
       0 static files copied.

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

-----> Compiled slug size is 29.5MB
-----> Launching... done, v6
       http://simple-spring-9999.herokuapp.com deployed to Heroku

To git@heroku.com:simple-spring-9999.git
* [new branch]      master -> master

アプリケーションへの訪問

あなたはHerokuへのコードのデプロイが完了し、Procfileを使ってプロセスタイプの指定が済んでいる状態です。これで、Herokuに対してプロセスタイプを実行するように指示をだすことができます。Herokuはこれをするために、Dynoの中の関連するコマンドを走らせます。DynoとはHerokuの構成物の基本単位である軽量コンテナのことです。

webプロセスタイプの実行中のDynoがあることを確かめてみましょう :

:::term
$ heroku ps:scale web=1

アプリケーションのDynoの状態を確認することができます。heroku psコマンドは実行中のあなたのアプリケーションのDynoの一覧を表示します :

:::term
$ heroku ps
=== web: `gunicorn hellodjango.wsgi`
web.1: up for 10s

ここでは、1個のDynoが実行中です。

heroku openを使うとブラウザからアプリケーションへ訪問することができます。

:::term
$ heroku open
Opening simple-spring-9999.herokuapp.com... done

"It worked!"と書かれたDjangoのウェルカムページに出会うでしょう!

Dynoのスリープと拡張

実行中のWeb Dynoが1個のしかない場合、Dynoは非アクティブ状態から1時間経つとスリープに入ろうとします。これは復帰時の最初のリクエストの数秒間の遅延を引き起こします。後続のリクエストは通常通り動きます。

これを避けるために、Web Dynoを1個以上に拡張することができます。例えば以下のようにします :

:::term
$ heroku ps:scale web=2

それぞれのアプリケーションごとに、Herokuは750時間のDyno無料利用時間を提供しています。2個のDynoでアプリを実行しつづけると、この月次の無料範囲を超えてしまうので、拡張したものを戻してみましょう :

:::term
$ heroku ps:scale web=1

ログの閲覧

Herokuは、ログをあなたのアプリケーションの構成物を実行しているすべてのDynoの出力から集められた時系列にならんだイベントの出力として扱います。HerokuのLogplexはこれらの全てのイベントのための単体のチャンネルを提供します。

あなたの実行中のアプリケーションに関する情報を、logging commandsの一つである heroku logs を使ってみてみましょう :

:::term
$ heroku logs
2012-04-06T19:38:25+00:00 heroku[web.1]: State changed from created to starting
2012-04-06T19:38:29+00:00 heroku[web.1]: Starting process with command `gunicorn hellodjango.wsgi`
2012-04-06T19:38:29+00:00 app[web.1]: Validating models...
2012-04-06T19:38:29+00:00 app[web.1]:
2012-04-06T19:38:29+00:00 app[web.1]: 0 errors found
2012-04-06T19:38:29+00:00 app[web.1]: Django version 1.5, using settings 'hellodjango.settings'
2012-04-06T19:38:29+00:00 app[web.1]: Development server is running at http://0.0.0.0:6566/
2012-04-06T19:38:29+00:00 app[web.1]: Quit the server with CONTROL-C.
2012-04-06T19:38:30+00:00 heroku[web.1]: State changed from starting to up
2012-04-06T19:38:32+00:00 heroku[slugc]: Slug compilation finished

データベースの同期

heroku runコマンドを使うとone-off admin dynosを実行することが出来ます。これを使ってデータベースのスキーマからDjangoのモデルを同期する事が出来ます :

:::term
$ heroku run python manage.py syncdb
Running python manage.py syncdb attached to terminal... up, run.1
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

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'u53976'): kenneth
Email address: kenneth@heroku.com
Password: 
Password (again): 
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

Djangoシェルの使用

似たように、heroku runを使って、あなたがデプロイしたアプリケーションに対して任意のコードを実行するためのDjangoシェルを使う事ができます。

:::term
$ heroku run python manage.py shell
Running python manage.py shell attached to terminal... up, run.1
Python 2.7.4 (default, Apr  6 2013, 22:14:13)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.contrib.auth.models import User
>>> User.objects.all()
[<User: kenneth>]

次のステップ

Clone this wiki locally