こんにちは、皆さん!

今回はDjangoアプリをHerokuにデプロイする方法について紹介していこうと思います。


トピック


開発環境

開発環境としてはPythonは3.7.3を使っていきます。基本的に3.6バージョン以上であれば問題ないはずです。

Djangoni関しては2.2.6バージョンを使っていきます。

pipに関してはご自身のPython3に対応していればいいと思いますが、僕が使っているのは20.0.2です。


必要なパッケージのインストール

Pythonではそれぞれのアプリ毎に仮想環境を作るのが一般的です。Djangoアプリを作ったら、即座に仮想環境を構築しましょう。

virtualenvwrapperというパッケージを既にインストール済みなら、それを使って下記のように仮想環境を構築しましょう。

mkvirtualenv django_heroku_env

まだこのパッケージをインストールしていない方はこちらを参考にしてみてください!


Djangoはもちろん、Heroku上で必要になるパッケージもありますので、まずはそれらをPipでインストールしましょう。

pip install django gunicorn dj-database-url whitenoise psycopg2

パッケージの解説:

  • gunicorn: Herokuが推奨するウェブサーバーを構築してくれるパッケージ。Railsから来た人ならPumaを想像するとわかりやすいかも
  • dj-database-url, psycopg2: HerokuのPostgresqlを設定する際に必要になるパッケージ。
  • whitenoise: Herokuで静的なファイルを処理するために必要なパッケージ。

この状態でインストールされたパッケージたちを requirements.txt というファイルにアウトプットしましょう。このファイルが後にHeroku上で必要なパッケージを管理してくれるようになります。

pip freeze > requirements.txt

以降、基本的に新しいパッケージを追加したのなら、このコマンドで requirements.txt ファイルを更新しましょう。

現在の requirements.txt ファイルは下記のような感じになっているはずです。

asgiref==3.2.7
dj-database-url==0.5.0
Django==3.0.5
gunicorn==20.0.4
psycopg2==2.8.5
pytz==2019.3
sqlparse==0.3.1
whitenoise==5.0.1

ローカルでのセットアップ

次にHerokuにデプロイされた際にウェブサーバーを起動させるためのコマンドを入れていきます。この際にはProcfileに書いていきます。

ここでは僕のアプリの名前がdjango_herokuだからこのような内容を足します。皆さんは自分のDjangoアプリの名前をしっかりここに追加してください。

web: gunicorn django_heroku.wsgi --log-file -

次に静的なファイルたちの設定をする必要がありますので、settings.pyを開き、一番下でいいですので、下記の内容を書き込みます。

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
PROJECT_ROOT   =   os.path.join(os.path.abspath(__file__))
STATIC_ROOT  =   os.path.join(PROJECT_ROOT, 'staticfiles')
STATIC_URL = '/static/'

# Extra lookup directories for collectstatic to find static files
STATICFILES_DIRS = (
    os.path.join(PROJECT_ROOT, 'static'),
)

#  Add configuration for static files storage using whitenoise
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'

さらにWhiteNoiseをsettings.pyファイル内のミドルウェアに入れます。入れた後のミドルウェアの部分は下記のようになります。

MIDDLEWARE = [
    'whitenoise.middleware.WhiteNoiseMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

さらにHeroku上でのデータベースの設定をする必要があります。

ここの部分はローカルと本番用で出し分けたいので、下記のように設定します。

app_stage = os.environ.get("APP_STAGE", "dev")
if app_stage == "prod":
    import dj_database_url 
    prod_db  =  dj_database_url.config(conn_max_age=500)
    DATABASES['default'].update(prod_db)

ここのAPP_STAGEがご自身のアプリがどの環境にいるのかを示してくれます。

(注意)この環境変数は自分で決めたものですので、忘れずにHerokuに追加しないといけません。


ここまで完了したら、一度Herokuアプリを生成しましょう。オススメはコマンドの方から作ることです。

その前にGitレポジトリ化しておくと、便利ですので、先にそちらを実行しましょう。

git init

そしたら、Herokuアプリを生成します。

heroku create

ここで出てきたHerokuアプリのホストネームを settings.py ファイル内のALLOWED_HOSTSに入れましょう。

ALLOWED_HOSTS = [
    "fathomless-waters-51012.herokuapp.com"
]

そしたら、Herokuにプッシュしましょう。

git add -A
git commit -m "Initial commit"
git push heroku master

この際に下記のようなエラーが出た場合:

remote:  !     Error while running '$ python manage.py collectstatic --noinput'.
remote:        See traceback above for details.
remote: 
remote:        You may need to update application code to resolve this error.
remote:        Or, you can disable collectstatic for this application:
remote: 
remote:           $ heroku config:set DISABLE_COLLECTSTATIC=1
remote: 
remote:        https://devcenter.heroku.com/articles/django-assets
remote:  !     Push rejected, failed to compile Python app.

このエラーを解消するためには下記のように環境変数を設定して、再度プッシュすれば大丈夫です。

heroku config:set DISABLE_COLLECTSTATIC=1

次に先ほど自分で追加した今どの環境にいるのかを教えてくれる環境変数を足していきたいと思います。

heroku config:set APP_STAGE=prod

そしたら、コマンドからHerokuアプリを開きましょう。

heroku open

下記のようなウェブページに行き着いたのならオッケーなはずです。

Herokuサイト

今回使ったコードに関してはこちらに載せておきました。

これからDjangoとHerokuでアプリケーションを作りたい方はこちらをダウンロードしてもらって、それから書き始めてもいいでしょう!


デプロイの後

今回は使っていませんが、デプロイしてからマイグレーションなどをやって、データベースを形作るというようなことができます。

これらは元々Pythonのコマンドでできます。ですので、Heroku上ではHerokuのコマンドに続けてこのPythonのコマンドを実行します。

heroku run python manage.py migrate

まとめ

今回はHerokuにDjangoアプリをデプロイする方法について紹介させていただきました。

様々あるプラットフォームの中でHerokuは基本的に無料で使えるので、初心者にとってとても始めやすいプラットフォームではないかと思います。Djangoでアプリを書いたのなら是非ともオンライン上にあげたいと思いますので、このような機会を利用してアップロードしましょう。

この他にもメールの送信方法もまとめましたので、よかったら参考にしてみてください↓


皆さんの役に立つことを願います!
では、また次回まで✌
記事更新はツイッターで告知するので、ツイッターの方でもフォローお願いします!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です