Django urls.py触发RecursionError:递归深度超限问题求助
Django URL路由递归错误排查与解决
我配置URL路由指向应用内的urls.py时,反复出现RecursionError。根urls.py代码如下:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('shop/', include('ptr.urls')) ]
完整报错回溯信息(翻译后):
Traceback (最近的调用最后): 文件 "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/threading.py", line 1009, in _bootstrap_inner self.run() 文件 "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/threading.py", line 946, in run self._target(*self._args, **self._kwargs) 文件 "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/utils/autoreload.py", line 64, in wrapper fn(*args, **kwargs) 文件 "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/core/management/commands/runserver.py", line 134, in inner_run self.check(display_num_errors=True) 文件 "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/core/management/base.py", line 475, in check all_issues = checks.run_checks( 文件 "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/core/checks/registry.py", line 88, in run_checks new_errors = check(app_configs=app_configs, databases=databases) 文件 "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/core/checks/urls.py", line 42, in check_url_namespaces_unique all_namespaces = _load_all_namespaces(resolver) 文件 "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/core/checks/urls.py", line 72, in _load_all_namespaces namespaces.extend(_load_all_namespaces(pattern, current)) 文件 "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/core/checks/urls.py", line 72, in _load_all_namespaces namespaces.extend(_load_all_namespaces(pattern, current)) 文件 "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/core/checks/urls.py", line 72, in _load_all_namespaces namespaces.extend(_load_all_namespaces(pattern, current)) [上述行重复987次] 文件 "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/core/checks/urls.py", line 62, in _load_all_namespaces namespaces = [ 文件 "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/core/checks/urls.py", line 65, in <列表推导式> if getattr(url, "namespace", None) is not None RecursionError: 调用Python对象时超出最大递归深度
问题原因
这种递归错误的核心原因是应用内的ptr/urls.py存在循环引用:要么反向引入了根urls.py,要么通过include('ptr.urls')重复引入自身,导致Django在解析路由规则时陷入无限递归。
解决步骤
- 打开
ptr/urls.py,检查是否存在以下情况:- 包含
include('项目根目录.urls')这类引用根路由的代码 - 包含
include('ptr.urls')这种引入自身路由文件的代码
- 包含
- 删除或修正上述循环引用的路由配置。应用内的
urls.py应只定义当前应用的具体路由规则,示例如下:
from django.urls import path from . import views urlpatterns = [ path('', views.index, name='shop_index'), # 其他应用专属的路由规则... ]
- 保存修改后重启Django开发服务器,递归错误即可解决。
内容的提问来源于stack exchange,提问作者William Zeng
相关产品推荐
相关产品推荐

