Django 常用的调试方法总结
常用的调试方式有两种,一般我们都习惯于用 print 函数打印到控制台,另外 Django 也提供了 logging 模块,下面我就逐一介绍以下两种方式的使用方法:
1、print 方法
由于使用 python manage.py runserver 实际是通过启动子进程的方式,子进程的标准输出不知道是到哪儿了,所以只有让调试服务器不以子进程的方式进行,可以用如下命令:
1 | python manage.py runserver - - noreload |
这样 print 出来的信息就可以在终端看到了,但是这样操作的问题就是每次代码有修改,就需要重启服务器。
2、使用 Django loging 模块
1 2 3 4 5 6 7 8 9 | # -*- coding:utf-8 -*- import logging # Get an instance of a logger logger = logging.getLogger(__name__) logger.debug( 'debug message' ) logger.info( 'info message' ) logger.warn( 'warn message' ) logger.error( 'error message' ) logger.critical( 'critical message' ) |
默认情况下,logging 模块将日志打印到屏幕上(stdout),日志级别为 WARNING(即只有日志级别高于 WARNING 的日志信息才会输出)。
在 setting.py 中配置日志:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | LOGGING = { 'version' : 1 , 'disable_existing_loggers' : False , 'handlers' : { 'file' : { 'level' : 'DEBUG' , 'class' : 'logging.FileHandler' , 'filename' : '/path/to/django/debug.log' , }, }, 'loggers' : { 'django' : { 'handlers' : [ 'file' ], 'level' : 'DEBUG' , 'propagate' : True , }, }, } |
复杂一点的日志配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | LOGGING = { 'version' : 1 , 'disable_existing_loggers' : False , 'formatters' : { 'verbose' : { 'format' : '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s' }, 'simple' : { 'format' : '%(levelname)s %(message)s' }, }, 'filters' : { 'special' : { '()' : 'project.logging.SpecialFilter' , 'foo' : 'bar' , }, 'require_debug_true' : { '()' : 'django.utils.log.RequireDebugTrue' , }, }, 'handlers' : { 'console' : { 'level' : 'INFO' , 'filters' : [ 'require_debug_true' ], 'class' : 'logging.StreamHandler' , 'formatter' : 'simple' }, 'mail_admins' : { 'level' : 'ERROR' , 'class' : 'django.utils.log.AdminEmailHandler' , 'filters' : [ 'special' ] } }, 'loggers' : { 'django' : { 'handlers' : [ 'console' ], 'propagate' : True , }, 'django.request' : { 'handlers' : [ 'mail_admins' ], 'level' : 'ERROR' , 'propagate' : False , }, 'myproject.custom' : { 'handlers' : [ 'console' , 'mail_admins' ], 'level' : 'INFO' , 'filters' : [ 'special' ] } } } |
logging 模块中几个比较重要的概念,Logger,Handler,Formatter,Filter:
- Logger 记录器,暴露了应用程序代码能直接使用的接口。
- Handler 处理器,将(记录器产生的)日志记录发送至合适的目的地。
- Filter 过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。
- Formatter 格式化器,指明了最终输出中日志记录的布局。
logging 模块的处理流程
- 判断日志的等级是否大于 Logger 对象的等级,如果大于,则往下执行,否则,流程结束。
- 产生日志。第一步,判断是否有异常,如果有,则添加异常信息。第二步,处理日志记录方法(如 debug,info 等)中的占位符,即一般的字符串格式化处理。
- 使用注册到 Logger 对象中的 Filters 进行过滤。如果有多个过滤器,则依次过滤;只要有一个过滤器返回假,则过滤结束,且该日志信息将丢弃,不再处理,而处理流程也至此结束。否则,处理流程往下执行。
- 在当前 Logger 对象中查找 Handlers,如果找不到任何 Handler,则往上到该 Logger 对象的父 Logger 中查找;如果找到一个或多个 Handler,则依次用 Handler 来处理日志信息。但在每个 Handler 处理日志信息过程中,会首先判断日志信息的等级是否大于该 Handler 的等级,如果大于,则往下执行(由 Logger 对象进入 Handler 对象中),否则,处理流程结束。
- 执行 Handler 对象中的 filter 方法,该方法会依次执行注册到该 Handler 对象中的 Filter。如果有一个 Filter 判断该日志信息为假,则此后的所有 Filter 都不再执行,而直接将该日志信息丢弃,处理流程结束。
- 使用 Formatter 类格式化最终的输出结果。 注:Formatter 同上述第 2 步的字符串格式化不同,它会添加额外的信息,比如日志产生的时间,产生日志的源代码所在的源文件的路径等等。
- 真正地输出日志信息(到网络,文件,终端,邮件等)。至于输出到哪个目的地,由 Handler 的种类来决定。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架