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

@okoppe8 さんの「[[Django] Heroku デプロイ方法 2018年版](https://qiita.com/okoppe8/items/76cdb202eb15aab566d1)」を元に、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系を使う必要があります。](https://docs.djangoproject.com/ja/2.1/faq/install/#faq-python-version-support)
ローカル環境でフォルダごとに異なる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 <module>
    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レベルのログを取得します。
(あまり内容に変わりが無い気もしますが。。。)