はじめに
opencvを使った、Djangoのデプロイについて、
ハマったので、個人備忘録を残します。
知識不足だったのは以下の2点。(2021/03/30現在)
- staticファイルの取扱いについて
- opencvのライブラリ
以下は、GitHub に push したDjango プロジェクトを
Heroku にデプロイする時の話です。
デプロイ後、
Webアプリを起動すると、ブラウザに以下の文章が表示され、
何をしたらいいのかよく分からない状態に陥りました。
Not Found
The requested resource was not found on this server.
今回はこのエラーに対する解決策を残します。
目次
- 開発環境
- Not Found の原因は opencv なので opencv-python-headless に変更して解決する
- アプリケーションサーバーで静的ファイルを参照できるようにpython manage.py collectstaticを実行する
- 参考文献
開発環境
MacBook Air 2017
macOS Catalina 10.15.16
dj-database-url==0.5.0
Django==3.1.7
django-heroku==0.3.1
gunicorn==20.1.0
mediapipe==0.8.3.1
numpy==1.20.2
opencv-python==4.5.1.48
venv (python -m venv venv)
Not Found の原因は opencv なので opencv-python-headless に変更して解決する
まずは原因を探すために以下を入力。
(venv) % heroku logs --tail
すると、ログの中間あたりに次のようなエラーが記録されていました。
(venv) % ImportError libgl.so.1 cannot open shared object file no such file or directory
調べてみると、
herokuでOpenCVを利用する [Python3]
を見つけ、同じような手順でbuildpacks、
Aptfileを追加してもエラーは解消されなかった。
そもそも ImportError: libSM.so.6:..ではなく、
...so.1:なんだけどな...
と思いながらさらに調べていくと、
以下にたどり着きました。
Importerror: libgl.so.1: cannot open shared object file: no such file or directory opencv error
以下のように、
requirements.txtを編集したら良かったみたいです。
requirements.txt
traitlets==4.3.3
tzlocal==2.1
urllib3==1.26.2
validators==0.18.1
watchdog==0.10.4
wcwidth==0.2.5
webencodings==0.5.1
widgetsnbextension==3.5.1
wincertstore==0.2
zipp==3.4.0
opencv-python--headless==4.5.1.48
上記のように、opencvライブラリは
--headless を含めたバージョンへの変更が必要だったみたいです。
<a id="#アプリケーションサーバーで静的ファイルを参照できるようにpython-manage.py collectstaticを実行する"></a>
# アプリケーションサーバーで静的ファイルを参照できるようにpython manage.py collectstaticを実行する
これでデプロイは成功したかのように思えましたが、
ブラウザ上での表示は変わらず Not Found.. のままでした。
何も表示されないのは、さすがにおかしいと思い、
静的ファイル関連で調べていくと、
以下の記事が見つかりました。
[Djangoにおける静的ファイル(static file)の取り扱い](https://qiita.com/saira/items/a1c565c4a2eace268a07)
この記事を参考に、
ターミナル上で以下を実行しました。
```terminal
(venv) % python manage.py collectstatic
これを実行し、
GitHub と Heroku への更新を反映させると、
無事アプリが表示されました。
Opencv は便利だけど大体導入でつまづく...。