この記事について
HerokuにDjangoをデプロイする際にPostgresを本番環境へ、SQLiteをローカル環境で自動につながるように設定する方法についてまとめます。
前提条件
既にDjangoがHerokuでデプロイされているが、DB設定を行ってない状態であるのが前提です。DjangoをHerokuにデプロイしていない場合、こちらを参考にデプロイしてください。Djangoはフォルダ構成にじゃっかん癖がある(Project
フォルダとApp
フォルダが別にある等)ので、馴染みのない方は既にHerokuに動くことを想定してフォルダ構成、設定ファイルが予め作られているものをgit clone
した方が早いです。
STEPS
大きく分けて、以下のステップを踏みます。
- PostgresをHerokuにインストール
- setting.pyの変更
- superuserの作成
1. PostgresをHerokuにインストール
実はDjangoをHerokuにデプロイした時点で、PostgresqlのインスタンスがHeroku上に自動で作成されています。インスタンスが作成されているかは、Herokuにログインしてadds-onにPostgresがあるか確認するほか、Heroku CLIで以下のコマンドを叩くことで確認できます。
$ heroku addons -a {Heroku Project Name}
以下、自分のラップトップで実行した際のスクリーンショットです。
もし、Posgresが無い場合、以下のコマンドを実行することでインスタンスを作成できます。
$ heroku addons:create heroku-postgresql:hobby-dev
2. setting.pyの変更
Django2.0でHerokuデプロイ手順を参考に、setting.py
のDATABASE情報を以下のように書き換えます。
# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases
from socket import gethostname
hostname = gethostname()
if "COMPUTER-NAME" in hostname:
# デバッグ環境
# DEBUG = True
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
ALLOWED_HOSTS = ['*']
else:
# 本番環境
# DEBUG = False
import dj_database_url
db_from_env = dj_database_url.config()
DATABASES = {
'default': dj_database_url.config()
}
ALLOWED_HOSTS = ['*']
hostname = gethostname()
では自分が操作しているコンピュータの名称が取得されています。コンピュータの名称はこちらで確認してください。確認後、"COMPUTER-NAME"
の部分を自分のコンピューターの名称に書き換えましょう。
これによりローカルからアクセスした場合のみif "COMPUTER-NAME" in hostname:
がTrueになるので、ディフォルトで設定してあったSQLiteの接続情報がその配下に書かれています。またelse:
では本番DB、つまりPostgresの接続情報が必要です。dj_database_url.config()
では、環境変数の一つであるDATABASE_URLを元に接続情報のディクショナリーが入ります。HerokuではディフォルトでDATABASE_URLにPostgresのパスが設定されているため、これ以上の設定は必要ありません。
3. superuserの作成
公式サイトの手順に従い、以下のコマンドを叩いてスーパーユーザを作成します。
$python manage.py createsuperuser
すると、Username
、Email Address
、Password
の登録をするように聞かれます。ここで設定する値はDjangoの用意するAdminページにログインする際に必要なので覚えておいてください。
次に、コマンドでローカルでこのDjango Appを立ち上げ、Adminページにアクセスできるかを確認します。
$python manage.py runserver
次に、ブラウザを開きhttp://127.0.0.1:8000/admin
へアクセスし、登録!したIDとパスワードを入力します。
これでログインができたら成功です。
ちなみに、スーパーユーザーの登録を行うとuser_auth
テーブルにレコードを挿入しにいきます。DB設定を行っていないと登録できないので、これでDBにつながっているのがわかります。
ローカルでDBに繋がっているのがわかったので、次に本番環境(Herokuサーバー)でも同じことを行います。Heroku CLIを使うことで以下のコマンドでcreatesuperuser
実行することができます。
$heroku run python manage.py createsuperuser
他にも、heroku run bash
を実行することでリモートサーバに直接アクセスできるので、そこでpython manage.py createsuperuser
を実行することもできます。
スーパーユーザ作成後、Adminサイトにローカルと同じように入ることができれば成功です。
最後に
3つお願いです!
・つまづいたりしたら気軽にメッセージください。サポートします。
・Djangoに詳しい方からのご意見、アドバイスお待ちしてます。
・ためになったと思ったら「いいね」押して頂けると幸いです。
参考
Add Postgresql Database to Django on Heroku
Heroku Posgresql 公式
Deploying Django to Heroku: Connecting Heroku Postgres
HerokuにDjangoアプリをデプロイする方法
Pypi dj-database-url 公式