DjangoでAppRegistryNotReadyにハマった話
あらすじ
とあるDjangoのプロジェクトをローカルで動かすためにmanage.py runserverをしたところ
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
というメッセージが出て動きませんでした。
とりあえずエラーメッセージをGoogle検索してヒットしたページに書かれていることはある程度試したのですが、それでもうまく行きませんでした。
結局プロジェクトの作成者に確認したところ、どうやらDjangoのバージョンが違うということに問題があることがわかりました。
発生した状況
gitで管理されているDjangoのプロジェクトをcloneしたところrequirements.txtが見当たらなかったので、とりあえずrunserverしてエラーが消えるまで一個ずつ必要なライブラリを仮想環境に入れていくことにしました。
まずは仮想環境を作り、runserverをしてみると...
(venv) > python manage.py runserver
(中略)
ModuleNotFoundError: No module named 'pymysql'
エラーメッセージは「pymysqlというライブラリが入ってないよ」と言っているので入れました。
(venv) > pip install pymysql
再度runserverすると...
(venv) > py manage.py runserver
(中略)
raise AppRegistryNotReady("Apps aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
よく分からないメッセージが出てきました。
やったこと
Pythonに限らず、エラーが出た場合はエラーメッセージをGoogle検索すると答えがすぐに見つかることがあります。
が、今回は結局よくわかりませんでした。
幸いにもこのプロジェクトの作成者にコンタクトが取れる状況だったので一緒に確認しながら問題の切り分けをした結果、使用しているDjangoのバージョンが違うことがわかりました。
このプロジェクトはバージョン2.0.13を使用していました。
最初は何も考えず以下のように最新バージョンのDjangoを仮想環境にインストールしていました。
(venv) pip install django
ということで、バージョンを指定してDjangoを入れなおしました。
(venv) pip install django==2.0.13
これだけで既にインストールされているものを削除し、新たにバージョンを指定したものをインストールしてくれます。
(requirements.txtを提供してもらえるなら、そこから仮想環境を作り直すのが一番手っ取り早いです。)
Djangoを入れなおしてrunserverしたところ、エラーメッセージが変わりました。
問題を一つクリアしたという証です!
(venv) > py manage.py runserver
(中略)
ModuleNotFoundError: No module named 'jpholiday'
あとは足りないライブラリを順次入れていったら無事動きました。
まとめ
今回のエラーはDjangoそのもののバージョン依存に原因がありました。
Djangoだけに限らず、コードの動作環境を明確化させるためにも極力requirements.txtを作るようにしましょう。
以下のコマンドで作成できます。
(venv) pip freeze > requirements.txt
また、Pipenvを使用すればいちいちrequirements.txtを作成・更新する必要はなくなるようです。
使ったことがないので今度試してみたいと思います。