Django Debug工具
Django Debug工具

Django Debug工具

之前都是自己写中间件、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

使用

  1. 启动项目:python manage.py runserver
  2. 打开浏览器:访问你的任意一个页面,比如 http://127.0.0.1:8000/
  3. 看右侧:应该会看到浏览器窗口的右上角或者右侧边栏出现了一个 “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页面看到更多的信息,具体排查是那儿出了问题。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注