本でDjangoの勉強をしていて、実際にサーバー上で動かしたかったので、Herokuにdeployしました。その際に、躓いた点があったので、記録します。
Herokuで動作させたい環境
Django 2.2.5
躓いた点
1.「No default language 」エラー
git pushコマンド実行後、以下のようなエラーが表示されました。
No default language could be detected for this app.
これはHerokuで作ったアプリで動作させるプログラミング言語が設定されていないために表示されるようです。今回はPythonを使用しているので、以下のコマンドで設定を行います。
ryuki@ryuki MINGW64 ~/Desktop/django_app (master)$ heroku buildpacks:set heroku/python
Buildpack set. Next release on thawing-waters-78052 will use heroku/python.
Run git push heroku master to create a new release using this buildpack.
或いはブラウザ上でも設定でき、Herokuのマイページを開き、「Personal」→「アプリの詳細画面」→「Settings」のadd buildpackでPythonを選択するのでも、設定可能です。
2.「App not compatible with buildpack」エラー
No default languageをクリアしたと思い、pushしたら次に以下のようなエラーが表示されました。
App not compatible with buildpack: https://buildpack-registry.s3.amazonaws.com/buildpacks/heroku/python.tgz
これを解消するのに以下のことを行います。
まず、デプロイするアプリ内にProcfileを作成します。内容は以下の一文とし、myprojectの部分は自分のフォルダ名に変えます。
web: gunicorn myproject.wsgi
次に、ローカルの開発環境内で以下のパッケージをインストールし、それをrequirements.txtファイルに書き出します。以下のコマンドを実行します。
pip install gunicorn
pip install django-heroku
pip freeze > requirements.txt
また、以下のコードをsettings.pyの最後に追加します。
import django_heroku
# Activate Django-Heroku.
django_heroku.settings(locals())
以上が完了次第、デプロイすると、正常に動作するはずです。
また、ここでCSSファイルが反映されていない場合は3.を参考にして頂ければ幸いです。私の場合は、1回目のデプロイでstaticが反映されていないので3.まで進んだのですが、2回目の別のドメインでのデプロイでは2.まで行っただけで、staticが反映されていました。この辺は分かりません。
3.staicファイルが反映されない。
1回目にデプロイしたときは反映されなかったのに、2回目ブログ用にデプロイしたときは、何も対策なく反映されたので、この辺よくわかりませんが、一応1回目に行った対策をまとめておきます。
まず、以下のパッケージをローカルでインストールし、これをrequirements.txtに書き込みます。
次に、settings.pyに以下を追加します。
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
# Extra places for collectstatic to find static files.
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
また、 settings.pyのMIDDLEWARE に以下を追加します。
'whitenoise.middleware.WhiteNoiseMiddleware',
最後に、以下を実行して、pushします。
$heroku config:set DISABLE_COLLECTSTATIC=1
以上でDjangoで作成したアプリがstaticも含めて動作するようになりました。
データベース設定方法
まず、heroku側でデータベースの準備を行うために以下を実行します。
$ heroku addons:create heroku-postgresql:hobby-dev
次に、マイグレーションファイルを作ります。ローカル環境で作成してもherokuにpushした後でも良いですが、ここでは、ローカル環境で作成しています。以下のコマンドを実行します。
$python manage.py makemigrations アプリ名
続いて、heroku側でマイグレーションを実行します。これは、作成したマイグレーションファイルを適用してデータベースを更新します。
$heroku run python manage.py migrate
以上で、Herokuのデータベースで指定のテーブルを利用できるようになります。
最後にデータベースの管理者を登録します。以下のコマンドを実行し、ユーザ名、メールアドレス、パスワードを設定します。
$ heroku run python manage.py createsuperuser
以上でデータベースの設定は完了です。
参考サイト
-
Configuring Django Apps for Heroku | Heroku Dev Center
https://devcenter.heroku.com/articles/django-app-configuration -
Django and Static Assets | Heroku Dev Center
https://devcenter.heroku.com/articles/django-assets