@okoppe8 さんの「[Django] Heroku デプロイ方法 2018年版」を元に、HerokuにDjangoのプロジェクトをデプロイしました。
自分の理解も兼ねて、コピぺでなく手打ちで写経したのですが、エラーが出て困ったので備忘録です。
原因は私の打ち間違いですが、エラーメッセージをググっても一発で解決策が見つからなかったので、同じ状況になりそうな未来の自分向けに書きました。
バージョンの確認
$ heroku run python --version
Python 3.6.6
$ heroku run python -c "import django; print(django.get_version())"
2.1.3
runtime.txt
や requirements.txt
で指定したバージョンになっていることを確認します。
heroku run python manage.py createsuperuser でエラー
$ heroku run python manage.py createsuperuser
django.db.utils.OperationalError: no such table: auth_user
ローカル開発環境とHeroku環境でDBの接続方法を変え、「DEBUG=False」で切り替えていましたが、Heroku環境で「DEBUG=True」に変えるのを忘れていました。
マイグレーションが行われているか確認
$ heroku run python manage.py showmigrations
でマイグレーションが行われているか確認します。
admin
[X] 0001_initial
のように、「[X]
」ならOK。
「[ ]
」ならマイグレーションが行われていないので、DBの設定を確認します。
(あるいは、プロジェクト名/settings.pyの「DEBUG=False」がTrueのままになっていないか確認します)
createsuperuserが正しく動いた場合
正しく動くと、以下のようにユーザ名やパスワードを対話形式で設定できます。
$ heroku run python manage.py createsuperuser
Username (leave blank to use 'abcde12345'):
Email address:
Password:
Password (again):
Superuser created successfully.
python manage.py runserver で開発用サーバを起動しようとした時に、SyntaxError エラーが出る
$ python manage.py runserver
File "manage.py", line 14
) from exc
^
SyntaxError: invalid syntax
pythonのバージョンが2系だった場合に出ます。Django2系では、Python3系を使う必要があります。
ローカル環境でフォルダごとに異なるpythonバージョンが入っていたり、dockerに異なるpythonバージョンが入っている場合などで発生します。
python --version
でバージョンを確認します。
WEBサーバ(gunicorn)が起動しない
heroku[web.1]: State changed from crashed to starting
heroku[web.1]: Starting process with command `unicorn manager_project.sgi --log-file -`
heroku[web.1]: State changed from starting to crashed
heroku[web.1]: Process exited with status 127
app[web.1]: bash: unicorn: command not found
「Starting process with command ...
」の行に注目し、Procfile
に書いたコマンドが間違えていないか確認します。
(上記では、gunicornをunicornと間違えていて、.wsgiを.sgiと間違えている)
ローカル環境では動くのに、Herokuではmoduleが見つからない
ログに503エラーが出る場合は、git pushしたタイミングでのログを見ます。
app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/util.py", line 350, in import_app
app[web.1]: __import__(module)
app[web.1]: ModuleNotFoundError: No module named 'manager_project.sgi'
上記の場合は、ファイルの拡張子を「.wsgi」とすべきを「.sgi」としているので、ファイルが見つからずエラーになっています。
テストデータ作成のためにPythonシェルでモデルをimportする時にエラー
モデルを定義して、テストデータ作成のためにPythonシェルから
$ heroku run python manage.py shell
>>> from manager.models import Person, Manager, Worker
と、モデルをimportした時に、
RuntimeError: Model class manager.models.Person doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
と出た時は、プロジェクト名/settings.py の INSTALLED_APPS に書いたアプリ名が正しいか、確認します。
ビューとテンプレートを作成して、開発用WEBサーバを起動したら、エラー
File "/code/manager_project/urls.py", line 21, in
path('worker_list/', manager_view.WorkerListView.as_view())
NameError: name 'manager_view' is not defined
urls.pyで「import manager.views as manager_view」のようにインポートするべきを、忘れていました。
heroku log で出るDjangoのログをDEBUGレベルに変更する
ログに表示される情報が不足している場合は、heroku config:set DJANGO_LOG_LEVEL=DEBUG
でDEBUGレベルのログを取得します。
(あまり内容に変わりが無い気もしますが。。。)