pipenv + django でHerokuにデプロイした際にハマった(備忘録
pipenv を使用して django環境を作っていた。
HerokuにPushした際は問題ないと表示されていたが、
実際にURLに行ってみるとApplication errorと表示されていた。
Herokuエラーログ(一部)
django というモジュールが見つからんとのこと(そんなばかな)
2018-09-28T12:56:15.288358+00:00 app[web.1]: File "/app/pages_project/wsgi.py", line 12, in <module>
2018-09-28T12:56:15.288359+00:00 app[web.1]: from django.core.wsgi import get_wsgi_application
2018-09-28T12:56:15.288393+00:00 app[web.1]: ModuleNotFoundError: No module named 'django'
解決編は下の方。
結論とは関係ないが本読みながら進めていたので
下記のことをやった(いずれもpipenv shell 後)
- update Pipfile.lock
- make a new Procfile file
- install gunicorn as our web server
- make aone-line change to settings.py
1, Pipfileに下記を追記 (Python3.7を使っていることを明示)
[requires]
python_version = "3.7"
実行(Pipfile.lockをつくるため)
$ pipenv lock
2. Procfileの作成
$ touch Procfile
下記内容を作成したProcfileに記述
gunicorn 使うの初めてだったのであまり理解できてないが
簡単に調べた感じでは記述は問題なさそう
web: gunicorn pages_project.wsgi --log-file -
3. gunicornモジュールインストール
pipenv install gunicorn==19.8.1
4.settings.pyを変更
ALLOWED_HOSTS = ['*']
ホストをワイルドカードにしているだけなので特に問題なし
(セキュリティ云々は一旦おいておく)
その他 Herokuに対しての操作
$ heroku config:set DISABLE_COLLECTSTATIC=1
Rails で言うところのAssetをまとめる機能らしい。
Djangoドキュメント
https://django-staticfiles-doc-ja.readthedocs.io/en/latest/commands.html
Herokuの説明
こちらも特に問題になるような操作ではない
$ heroku ps:scale web=1
heroku ps:scale worker=1 # ワーカープロセスを1つにします。
<解決編>
数時間悩んだが結局のところ非常に簡単な問題だった。
historyコマンドで確認したところ下記のような作業をしていた。
※やってはいけない例
pipenv shell
pip install django
(仮想環境に入ったあと、pipでdjangoをインストールする)
これをするとPipfileにDjangoの情報が入らず、
そのせいでエラーが出てしまう。
なので、
アプリケーションのルートに行き
pipenv install django
を実行したところ、
PipfileとPipile.lockが自動的に書き換えられた。
その後、herokuにpushしたらエラーが解消。
-------------------------------------------------
つまり、Django導入時は必ず
pipenv install django
pipenv shell
という順番を守りましょう、という結論。
-------------------------------------------------
- 仮想環境に入ってからのpip install
- pipenv install
多分同じだろう、って思ってたが全然違いました。
おわり