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 後)

  1. update Pipfile.lock
  2. make a new Procfile file
  3. install gunicorn as our web server
  4. 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

 

qiita.com

Rails で言うところのAssetをまとめる機能らしい。

 

Djangoドキュメント

https://django-staticfiles-doc-ja.readthedocs.io/en/latest/commands.html

 

Herokuの説明

devcenter.heroku.com

 

 

 

こちらも特に問題になるような操作ではない

$ heroku ps:scale web=1

 
heroku ps:scale worker=1 # ワーカープロセスを1つにします。

qiita.com

 

 

 

 

<解決編>

数時間悩んだが結局のところ非常に簡単な問題だった。

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 

多分同じだろう、って思ってたが全然違いました。

 

 

おわり