最常见原因是INTERNAL_IPS未配置或配错,必须显式添加'127.0.0.1'等开发IP;DEBUG=True且中间件顺序正确(DebugToolbarMiddleware置于SecurityMiddleware后、SessionMiddleware前);SQLPanel需确认已启用并手动开启“Show duplicate queries”和“Enable EXPLAIN”才能暴露N+1等问题。

django-debug-toolbar 能直接暴露页面加载慢的根因,但装完默认看不到 SQL 面板或缓存统计——不是它没用,是你没配对。
为什么装了 django-debug-toolbar 却没显示工具栏
最常见原因是 INTERNAL_IPS 没配或配错。它只对列表里的 IP 显示工具栏,哪怕你在本地开发,也得显式写上 '127.0.0.1',不能靠 localhost 或空字符串兜底。
-
DEBUG = True必须为True,且只在开发环境启用 -
INTERNAL_IPS是元组或列表,写成['127.0.0.1']或('127.0.0.1',),别漏逗号 - 如果用 Docker 或 WSL,宿主机 IP 可能不是
127.0.0.1,得加进去,比如['127.0.0.1', '192.168.16.1'] - 中间件
debug_toolbar.middleware.DebugToolbarMiddleware必须放在SecurityMiddleware之后、SessionMiddleware之前;顺序错会导致工具栏不渲染
SQLPanel 不显示查询?检查这三处
页面慢大概率是数据库拖的,但 SQLPanel 默认关掉“重复查询高亮”和“EXPLAIN”,你得手动点开每条语句才能看到执行计划。
- 确认
DEBUG_TOOLBAR_PANELS列表里包含'debug_toolbar.panels.sql.SQLPanel'(Django 4.2+ 默认已含) - 面板右上角有齿轮图标,点开勾选
Show duplicate queries和Enable EXPLAIN,否则 N+1 查询根本看不出来 - 如果用了
select_related或prefetch_related但没生效,SQLPanel会显示多条相似SELECT,注意比对FROM子句和参数值
CachePanel 显示“0 hits”但你明明用了缓存
缓存面板依赖猴子补丁拦截 cache.set、cache.get 等调用,一旦你绕过 Django 的 cache 实例(比如直连 Redis 客户端),它就完全不可见。
- 确保所有缓存操作都走
from django.core.cache import cache,而不是redis.Redis()或memcache.Client() -
CachePanel默认只记录命中/未命中次数,不显示 key 内容;想查具体 key,得在面板里点“Details”展开调用栈 - 如果用了
@cache_page装饰器,它走的是中间件层缓存,CachePanel不捕获——得看Headers面板里的X-Cache响应头
TimerPanel 显示总耗时 2s,但各子项加起来才 300ms
差值大概率是模板渲染或静态文件加载卡住。Django Debug Toolbar 自身也会引入少量开销,但不会超过 50ms。
立即学习“Python免费学习笔记(深入)”;
- 打开
Templates面板,看哪个模板Render time异常高,尤其是带循环或嵌套{% include %}的 - 检查
Static Files面板:如果某 JS/CSS 加载耗时 >500ms,说明STATICFILES_STORAGE配置有问题,或 CDN 未生效 - 若用 Gunicorn +
--reload开发,工具栏可能干扰热重载;建议单独起一个runserver进程专用于调试
for 循环里调 obj.related_set.all(),或者缓存 key 拼错导致全量穿透——这些,只有开着 SQLPanel 和 CachePanel 并点开每一项细节才能揪出来。


















