HerokuにDjangoのプロジェクトをデプロイした時のエラーのメモ

@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.txtrequirements.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レベルのログを取得します。
(あまり内容に変わりが無い気もしますが。。。)

コメントを残す

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