-
Notifications
You must be signed in to change notification settings - Fork 9
Django
このチュートリアルはHerokuにデプロイされる、Postgresデータベースを使ったPython/Djangoアプリケーションを扱って行きます。他のPythonのアプリケーションについてはGetting Started with Python on Herokuを確認してください。Herokuを使ったアプリケーションの開発や設計の仕方に関する一般的な情報は、Architecting Applications for Herokuを確認してください。
- Heroku Toolbelt。Getting Started with Pythonの中で説明をしています。
- インストールされているPythonとVirtualenv。わからない場合はこのガイドを確認してください。
- ローカル環境でテストをするために、インストールされたバージョンのPostgres。
- Herokuのユーザアカウント。こちらで無料で簡単に取得ができます。
始めに、私たちのプロジェクトのために、空のトップレベルディレクトリを作ります :
:::term
$ mkdir hellodjango && cd hellodjango
次にPython Virtualenv(v0.7)を作ります :
:::term
$ virtualenv venv --distribute
New python executable in venv/bin/python
Installing distribute...............done.
Installing pip...............done.
新しいvirtualenvを作るために、これをアクティベートする必要があります。(あなたのアプリケーションを実行したいと思っているそれぞれのターミナルのセッションごとに、wirtualenvの環境を用意する必要があります)
:::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アプリケーションを作りましょう :
:::term
$ django-admin.py startproject hellodjango .
アプリケーションのルートディレクトリにあるテキストファイルであるProcfileを使って、Web Dynoを開始させるために何のコマンドを実行するべきかを明示的に宣言します。この場合は、Gunicornをいくつかの引数と共にを実行する必要があります。
これは私たちのアプリケーションのための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で終了します。
HerokuはPythonアプリケーションをリポジトリのルートディレクトリにあるrequirements.txt
ファイルによって判断します。このシンプルなフォーマットはほとんどのPythonのプロジェクトに置いて、アプリケーションが必要としている外部のPythonモジュールを明示するために使われます。
Pipはpip freeze
という、私たちのためのこのファイルを生成してくれる素敵なコマンドを持っています :
:::term
$ pip freeze > 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の依存ファイルをみて、更に学習してみてください。
次に、Heroku's Postgres データベースを含んだ、Herokuの環境向けのアプリケーションの設定をして行きましょう。dj-database-urlモジュールはDATABASE_URL
environment variableの値をパースし、Djangoが理解できる形に変換します。
'dj-database-url'は必要なファイルの中にあります。以下のコードを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
に以下のコードを追加します :
:::python
from django.core.wsgi import get_wsgi_application
from dj_static import Cling
application = Cling(get_wsgi_application())
アプリケーションが書き終わり、テストが完了している今、私たちはGitのリポジトリにこのプロジェクトを格納する必要があります。
現在のディレクトリには余分なファイルがたくさん含まれているため、.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 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のウェルカムページに出会うでしょう!
実行中の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)
似たように、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>]
- Djangoと静的アセット自動的なcollectstaticの実行について学ぶ。
- Pythonカテゴリ を訪問し、Pythonアプリケーションの開発とデプロイについて更に学ぶ。
- Pipを経由したPythonの依存ファイル と Pythonの実行系の明示 について学ぶ。
- RQを使ったPythonのバックグラウンドタスクでアプリケーションの設計を拡張する。
- アプリケーションを書いたり、構成したり、デプロイしたり、実行する時に直面するだろう概念について、技術的な大枠を知りたい場合はHerokuの仕組みを読む。