21
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

初心者向け:HerokuにDjangoをデプロイする際のPostgresの設定

Posted at

#この記事について
HerokuにDjangoをデプロイする際にPostgresを本番環境へ、SQLiteをローカル環境で自動につながるように設定する方法についてまとめます。

#前提条件
既にDjangoがHerokuでデプロイされているが、DB設定を行ってない状態であるのが前提です。DjangoをHerokuにデプロイしていない場合、こちらを参考にデプロイしてください。Djangoはフォルダ構成にじゃっかん癖がある(ProjectフォルダとAppフォルダが別にある等)ので、馴染みのない方は既にHerokuに動くことを想定してフォルダ構成、設定ファイルが予め作られているものをgit cloneした方が早いです。

#STEPS
大きく分けて、以下のステップを踏みます。

  1. PostgresをHerokuにインストール
  2. setting.pyの変更
  3. superuserの作成

###1. PostgresをHerokuにインストール
実はDjangoをHerokuにデプロイした時点で、PostgresqlのインスタンスがHeroku上に自動で作成されています。インスタンスが作成されているかは、Herokuにログインしてadds-onにPostgresがあるか確認するほか、Heroku CLIで以下のコマンドを叩くことで確認できます。

$ heroku addons -a {Heroku Project Name}

以下、自分のラップトップで実行した際のスクリーンショットです。
heroku_addson.jpg

もし、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

すると、UsernameEmail AddressPasswordの登録をするように聞かれます。ここで設定する値はDjangoの用意するAdminページにログインする際に必要なので覚えておいてください。

次に、コマンドでローカルでこのDjango Appを立ち上げ、Adminページにアクセスできるかを確認します。

$python manage.py runserver

次に、ブラウザを開きhttp://127.0.0.1:8000/adminへアクセスし、登録!したIDとパスワードを入力します。
admin_screenshot2.JPG

これでログインができたら成功です。
ちなみに、スーパーユーザーの登録を行うと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 公式

21
14
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?