Django学习

标签: Python 分类: Python 创建时间:2020-08-20 01:48:53 更新时间:2023-10-20 11:23:25

1.日志

日志十一个非常重要的工具,可以在运行时发现系统的错误。根据参考资料,我创建了自己的logger配置文件

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# 创建日志文件夹路径
LOG_PATH = os.path.join(BASE_DIR, 'log')
# 如过地址不存在,则自动创建log文件夹
if not os.path.isdir(LOG_PATH):
os.mkdir(LOG_PATH)


#下面就是logging的配置
LOGGING = {
'version': 1, # 指明dictConnfig的版本,目前就只有一个版本,哈哈
'disable_existing_loggers': False, # 表示是否禁用所有的已经存在的日志配置
'formatters': { # 格式器
'verbose': { # 详细
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
'standard': { # 标准
'format': '[%(asctime)s] [%(levelname)s] %(message)s'
},
},
# handlers:用来定义具体处理日志的方式,可以定义多种,"default"就是默认方式,"console"就是打印到控制台方式。file是写入到文件的方式,注意使用的class不同
'handlers': { # 处理器,在这里定义了两个个处理器
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'stream': 'ext://sys.stdout', # 文件重定向的配置,将打印到控制台的信息都重定向出去 python manage.py runserver >> /home/aea/log/test.log
# 'stream': open('/home/aea/log/test.log','a'), #虽然成功了,但是并没有将所有内容全部写入文件,目前还不清楚为什么
'formatter': 'standard' # 制定输出的格式,注意 在上面的formatters配置里面选择一个,否则会报错
},
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': '%s/log.txt' % LOG_PATH, #这是将普通日志写入到日志文件中的方法,
'formatter': 'standard',
'encoding': 'utf8'
},
'default': {
'level':'DEBUG',
'class':'logging.handlers.RotatingFileHandler',
'filename': '%s/log.txt' % LOG_PATH, #日志输出文件
'maxBytes': 1024*1024*5, #文件大小
'backupCount': 5, #备份份数
'formatter':'standard', #使用哪种formatters日志格式
'encoding': 'utf8'
},
# 上面两种写入日志的方法是有区别的,前者是将控制台下输出的内容全部写入到文件中,这样做的好处就是我们在views代码中的所有print也会写在对应的位置
# 第二种方法就是将系统内定的内容写入到文件,具体就是请求的地址、错误信息等,小伙伴也可以都使用一下然后查看两个文件的异同。
},
'loggers': { # log记录器,配置之后就会对应的输出日志
# django 表示就是django本身默认的控制台输出,就是原本在控制台里面输出的内容,在这里的handlers里的file表示写入到上面配置的 filename 文件里面
# 在这里的handlers里的console表示写输出到控制台
'django': {
'handlers': ['console','default'],
# 这里直接输出到控制台只是请求的路由等系统console,当使用重定向之后会把所有内容输出到log日志
'level': 'ERROR',
'propagate': True,
},
'django.request ':{
'handlers': ['console','default'],
'level': 'ERROR', # 配合上面的将警告log写入到另外一个文件
'propagate': True,
},
'django.db.backends': {
'handlers': ['default'], # 指定file handler处理器,表示只写入到文件
'level':'ERROR',
'propagate': True,
},
'console': {
'handlers': ['console'],
'level': 'INFO',
'propagate': True,
}
'logger': {
'handlers': ['console','default'],
'level': 'INFO',
'propagate': True,
}
},
}

基本元素说明:

Logger:用于输出的日志的总对象
Handlers:用来指定log的输出方式
Formatters:设置日志信息的结构和内容格式,默认的时间格式为%Y-%m-%d %H:%M:%S
Filter:过滤器,用来过滤的输出内容(如:只输出debug以上的内容)

我这上面只用到了Formatters、Handlers和Logger。Formatter定义了日志的记录格式,Handlers定义了日志输出时的处理器,而logger则定义了如何输出日志,比如上面的django,就是将django相关的日志输出到console和default定义的handlers中,也就是控制台和文件中,日志的级别时ERROR级别。同理,我说明我在loggers中定义的logger使用方法。

1
2
3
4
5
6
# 导入logging库
import logging


logger = logging.getLogger('logger')
logger.error('这是错误日志')

执行上面的代码,错误日志就会被同时输出到控制台,并在文件中记录。可以多处调用logger.error或者时logger.info

如果loggers中和Handlers中都定义了日志级别,怎么处理呢?官方有这么段话

When a message is given to the logger, the log level of the message is compared to the log level of the logger. If the log level of the message meets or exceeds the log level of the logger itself, the message will undergo further processing. If it doesn’t, the message will be ignored.
Once a logger has determined that a message needs to be processed, it is passed to a Handler.

只有达到了Loggers中定义的级别,才能够继续被Handlers处理。

参考文章:
1.Django 日志 (刘江的博客,是个系列教程,从环境搭建到日志模板,直到最后的实战项目,一整套的都有,如果有时间,可以仔细的品尝。这里使用了logger = logging.getLogger(name)获取日志对象,可以用来进行日志输出,但是好像是不对的。我用了getLogger(“[具体的settings.py中的loggers指定的名字]”)这种方式)
2.Django配置日志输出、logging配置最详细大全、控制台日志全部输出到文件、日志/控制台console重定向到文件 (我是用了其中的日志配置文件,但是print没有重定向到日志文件中)
3.14.7 捕获所有异常
4.Django写入日志 (我结合了参考文章2和这篇文章,配置了自己的日志记录的配置类)
5.python(logging )日志模块学习 (对于各种配置给与了相应的说明)
6.Logging (官方说明)
文章目录
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。