Django报错Traceback仅显示内置包无用户自定义文件如何排查
该错误本质是Wagtail启动时检查模型面板配置的过程中遇到了循环引用,递归深度超过Python默认限制后栈溢出,栈回溯仅打印了栈顶的第三方包调用内容,因此看不到自定义代码的触发位置。
排查步骤
- 优先检查所有自定义Wagtail页面、片段(Snippet)、可排序(Orderable)模型的
InlinePanel配置
90%以上的该类报错都来自两个存在关联关系的模型互相嵌套引用对方的InlinePanel,常见错误写法如下:
只要删除子模型中多余的、引用父模型的InlinePanel即可解决这类问题。# 错误示例 from wagtail.models import Page, Orderable from wagtail.admin.panels import InlinePanel from modelcluster.fields import ParentalKey class ArticlePage(Page): content_panels = Page.content_panels + [ # 主模型引用子项的InlinePanel InlinePanel("comment_items", label="评论") ] class CommentItem(Orderable): page = ParentalKey(ArticlePage, related_name="comment_items", on_delete=models.CASCADE) content = models.TextField() # 错误写法:子项中又引用了父模型的InlinePanel,造成检查逻辑死循环 panels = [ InlinePanel("page", label="关联文章") ] - 逐次注释近期新增的模型配置缩小排查范围
如果是近期新增模型/修改面板配置后才出现的报错,可以逐次注释新增的panels/content_panels配置项,每次注释后执行python manage.py check验证是否还会报错,快速定位触发问题的代码行。 - 临时调整Python递归深度输出完整栈信息
如果上述方法仍无法定位,可在manage.py文件最开头添加以下代码,临时调大递归上限,强制输出完整栈回溯:
调整后重新运行项目,完整的回溯信息就会展示出自定义代码的触发位置。import sys # 可以根据情况调整为2000~3000,不要设置过大避免系统栈溢出 sys.setrecursionlimit(2500) - 验证修复结果
修复完成后执行python manage.py check,如果无报错输出说明问题已解决。
内容的提问来源于stack exchange,提问作者Yan Tian
相关产品推荐
相关产品推荐

