目的
djangoのアプリを作成しようとして、modelの登録やsettings.pyの初期設定などどのdjangoのプロジェクトでも最初に行うようなことを行おうとして、ローカルサーバーで確認をしていこうと思った矢先、**「RecursionError: maximum recursion depth exceeded while calling a Python object」**と表示されてしまった。
状況
.test_api
├── db.sqlite3
├── manage.py
├── test_app
│ ├── __init__.py
│ ├── __pycache__
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ ├── models.py
│ ├── tests.py
│ ├── urls.py②
│ └── views.py
└── test_api
├── __init__.py
├── asgi.py
├── settings.py
├── urls.py①
└── wsgi.py
結論
①urls.pyのpathのinclude先を間違えていた。
実施環境
ハードウェア環境
項目 | 情報 |
---|---|
OS | macOS Catalina(10.15.7) |
ハードウェア | MacBook Air (11-inch, Early 2015) |
プロセッサ | 1.6 GHz デュアルコアIntel Core i5 |
メモリ | 4 GB 1600 MHz DDR3 |
グラフィックス | intel HD Graphics 6000 1536 MB |
ソフトウェア環境
項目 | 情報 |
---|---|
homebrew | 3.3.8 |
mysql | Ver 8.0.27 for macos10.15 on x86_64 |
python | 3.8.12 |
django | 3.1.2 |
anaconda | 4.10.1 |
pip | 21.2.4 |
経緯
djangoのアプリを作成しようとして、modelの登録やsettings.pyの初期設定などどのdjangoのプロジェクトでも最初に行うようなことを行おうとして、ローカルサーバーで確認をしていこうと思った矢先、**「RecursionError: maximum recursion depth exceeded while calling a Python object」**と表示されてしまった。
原因究明
「RecursionError: maximum recursion depth exceeded while calling a Python object」
ちゃんとエラー文を読んでみると、「Pythonオブジェクトの呼び出し中に最大再帰深度を超えました」→再帰しすぎです。
ということだった。
「再帰関数なんてどこにも使ってない気がするんだけどな、、」と追記したファイルを漁っていく。
解決
①urls.pyを見てみると、下記のようなコードになっていた。
①urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('test_api/', include('test_api.urls')),
]
これではtest_apiのurls.pyがtest_apiのurls.pyを呼ぶことになっていて、やはりエラー通り永遠に再帰してしまうことになってしまう。
ここを
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
# 修正前 path('test_api/', include('test_api.urls')),
path('test_app/', include('test_app.urls')),
]
このように変更すれば、解決。
こんなバカなことするなと思う人が大半かと思うが、意外と間違えてこのように実装して焦る人もいるのではないかと思う。気をつけよう。