之前都是自己写中间件、apifox接口测试来debug的。上一篇文章慢查询定位里,提到了一些工具,考虑一下,还是很有必要升级一下工具。
两个工具,DDT和DS,DDT主要针对Django原有的那套开发框架,就是后端、前端一起搓。DS针对前后端分离效果更好一下。
DDT(Django Debug Toolbar)
安装和配置
这个工具需要单独安装一下:pip install django-debug-toolbar。
然后需要先在项目的settings.py文件里面配置一下,分别是APP、中间件和一个特有的IP设置。
INSTALLED_APPS = [
# ... 其他原本的 app ...
'django.contrib.staticfiles',
# 在这里加上它 ↓
'debug_toolbar',
]
MIDDLEWARE = [ # ... 建议放在比较靠前的位置,但要放在CommonMiddleware后面(如果没有特殊中间件,放在列表最上面也没事
'debug_toolbar.middleware.DebugToolbarMiddleware', # ... 下面是你原本的 ... 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # ... ]
INTERNAL_IPS = [ "127.0.0.1", ] # 这个很重要,意思是指定的IP才能看到这个工具栏
再在路由urls.py文件(主目录那个urls)下配置下:
from django.contrib import admin
from django.urls import path, include # 1. 确保这里导入了 include
from django.conf import settings # 2. 导入 settings
urlpatterns = [
path('admin/', admin.site.urls),
# ... 你的其他 URL ...
]
# 3. 加上这段代码 ↓
if settings.DEBUG:
import debug_toolbar
urlpatterns = [
path('__debug__/', include(debug_toolbar.urls)),
] + urlpatterns
使用
- 启动项目:python manage.py runserver
- 打开浏览器:访问你的任意一个页面,比如 http://127.0.0.1:8000/
- 看右侧:应该会看到浏览器窗口的右上角或者右侧边栏出现了一个 “Dj” 的图标或者一个竖条面板。
考虑到喵喵CRM主要是前后端分离,DDT就没怎么深入研究了。
DS(Django Silk)
安装和配置
安装指令:pip install django-silk
同样需要settings.py和urls.py里面调整一下:
settings.py
MIDDLEWARE = [
...
'silk.middleware.SilkyMiddleware', # 加上这个
...
]
INSTALLED_APPS = [
...
'silk', # 加上这个
]
urls.py
urlpatterns += [path('silk/', include('silk.urls', namespace='silk'))]
最后记得python manage.py migrate一下,主要是silk需要一些日志记录。运行完这个指令后数据库内会出现这样几个表:

简单测试和介绍
运行项目,然后我们随便测试几个api接口(可以前端或者一些接口测试工具,我用的是apifox)。然后输入127.0.0.1:8000/silk/,就可以看到这样一个页面,里面会显示不同接口访问情况。(请忽略倒霉的404/skil/,单纯是我打错了~)
我们先看看主菜单第一个Summary页面,Requests我们后续再看。
Summary页面

- Summary是所有请求的平均值,
- Requests:表示捕获的请求;
- Profiles:是手动添加(@silk_profile)装饰器,具体分析某几行代码会用到,平时忽略;
- Avg. Time:表示所有请求平均响应时间。如果这个数字很大,比如大于500ms,说明整体系统偏慢。
- Avg. Queries:是平均查询次数。平均每个请求只查了0.5次数据库。
- Avg. DB Time:是指平均数据库耗时。
- Most Time Overall是最慢的请求。
- overall:某个接口总耗时;
- on queries:数据库查询时间;
- queries:执行的SQL语句数。
- Most Time Spent in Database是数据库耗时最久的请求。
- Most Database Queries是数据库查询最多的接口。
Requests页面

这个页面呢,就都是请求的具体信息。我们随便点击一个接口进去看看:

可以看到接口的一些访问信息以及反馈信息,最上面的SQL下还可以看到对数据库的访问情况:

点击某条,还能进去看到具体的执行语句:

- Query Plan是查询计划,数据库具体打算怎么执行。比如图中这个,意思就是Index lookup(索引查找),使用的是“外键索引”。因为Customer表里owner_id是外键,Django 自动给它加了索引。rows=2:数据库估算这次只需要扫描 2 行 数据就能找到结果。
- Traceback是调用栈。一般Python报错信息会体现在这儿。
太酷了!
接口页面
不过我们回到接口页面,也就是Request页面下点击某个具体接口的那个页面,具体看看某个接口是怎么下信息都是些什么。
前几个不用赘述了,请求头、请求体、响应啥的。
下面的这些很有意思了。

- Curl可以快速复制指令,来复现某个接口的请求情况。
- Django Test Client则是单元测试,把这下面的代码复制到tests.py里,改改就能用了。
Profiling
上面主要围绕数据库,有些时候或许是别的地方导致接口请求过慢。这个时候就可以掏出profiling了。
from silk.profiling.profiler import silk_profile
with silk_profile(name='Step 1: 计算缓存Key'):
# 你想监测的代码……
这样我们就可以在Profiling页面看到更多的信息,具体排查是那儿出了问题。