Posted at

HerokuにDjangoアプリをデプロイするときのまとめ

More than 3 years have passed since last update.

Djangoで簡単なWebアプリケーションを作成しHerokuにデプロイするまでのまとめを残しておきます.


データベースの切り替え

DjangoではデフォルトでSQLite3をデータベースに用います.けれどもHerokuではSQLite3使えない.

そこでHerokuを本番環境と想定し開発環境ではSQLiteを, HerokuではPostgresを使うように設定すると便利です.

まず,

$ pip install dj_database_url

$ pip freeze > requirements.txt

で必要なものをインストールしておきます.

次にsettings.pyを開き以下のように設定します.

DATABASES = {

'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}

# update db settings
import dj_database_url
db_from_env = dj_database_url.config(conn_max_age=400)
DATABASES['default'].update(db_from_env)

あとはHerokuのAdd-onを探してPostgresを入れておきます.

またPostgresをPython側で利用するためにライブラリをインストールする必要があります.

$ pip install psycopg2

$ pip freeze > requirements.txt

別に開発環境でPostgresを使わない人はインストールする必要が無いのでrequirements.txtに追記しておくだけでも:ok_hand:

最後にHerokuにpushしてDBを構築.

$ git push heroku master

$ heroku run python manage.py migrate


Herokuにデプロイしようとするとstaticfileがどうのこうのと言われる

公式ドキュメント通りに進めれば問題なく解決できると思います.


本番環境ではDEBUG = Falseにしたい

当たり前ですね.しかし調べてみてもあまり解決方法が見つかりませんでした.そこで私は環境変数PRODUCTIONを設定するようにしています.

# SECURITY WARNING: don't run with debug turned on in production!

DEBUG = (os.environ.get('PRODUCTION') != 'True')
TEMPLATE_DEBUG = (os.environ.get('PRODUCTION') != 'True')

Heroku側で Settings >> Config VariablesPRODUCTION = Trueと追加したのでHeroku側ではデバッグされないようになります.

Screen Shot 2016-02-15 at 14.50.09.png


Python app detected とならない

たまにあるそうですね.そんなときはBuildpackを設定します.

$ heroku buildpacks:set git://github.com/heroku/heroku-buildpack-python.git --app <APP NAME>


Pythonのバージョンを固定する

runtime.txtを書きます.例えばPython 3.5.1を使いたい場合は


runtime.txt

python-3.5.1


のように書くだけです.


デプロイは成功しているのにApplication Error

Herokuの仕様でWebプロセスを立ち上げてあげないとWebアプリ自体が起動しません.

$ heroku ps:scale web=1

で起動.1より大きい値にするとHerokuの課金対象になるので注意.

あとはheroku logs などを使ってログを見ておくとどこでエラーが起きているのか参考になります.

参考になれば私が書いたアプリケーションがGitHubにあるので見てください.

https://github.com/jtwp470/codecheck-971/


参考