django[十一] Django综合篇 - 迁
综合篇
Django日志
Django使用Python内置的logging模块实现它自己的日志系统。
在Python的logging模块中,主要包含下面四大金刚:
- Loggers: 记录器
- Handlers:处理器
- Filters: 过滤器
- Formatters: 格式化器
在Django视图中使用logging
# 导入logging库
import logging
# 获取一个logger对象
logger = logging.getLogger(__name__)
def my_view(request, arg1, arg):
...
if bad_mojo:
# 记录一个错误日志
logger.error('Something went wrong!')
每满足bad_mojo条件一次,就写入一条错误日志。
实际上,logger对象有下面几个常用内置方法:
- logger.debug() = 10
- logger.info() = 20
- logger.warning() = 30
- logger.error() = 40
- logger.critical() = 50
如果设置日志级别为WARNING,则通过日志记录器则输入WARNING级别以下的信息是不会被处理的,会输出 >=30 等级的日志
在Django中配置logging
通常,只是像上面的例子那样简单的使用logging模块是远远不够的,我们一般都要对logging的四大金刚进行一定的配置。
Python的logging模块提供了好几种配置方式。默认情况下,Django使用dictConfig format。也就是字典方式。
例一:
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,
},
},
}
将全部日志写入单个文件中
例二:
下面这个示例配置,让Django将日志打印到控制台,通常用做开发期间的信息展示。
import os
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django': {
'handlers': ['console'],
'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
},
},
}
例三:
下面是一个相当复杂的logging配置:
LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"loggers":{
"webResty2": {
"level": "DEBUG",
"handlers": ["file_handle", "console"],
"propagate": True, # 选择关闭继承,不然这个logger继承自默认,日志就会被记录2次了('django'一次,自己一次)
},
"django.request": {
"level": "DEBUG",
"handlers": ["django_request_handler"],
"propagate": True,
},
"django":{
"level": "DEBUG",
"handlers": [ "django_handle"],
"propagate": False,
},
"report":{
"level": "ERROR",
"handlers": [ "mail"],
"propagate": True,
}
},
"filters": {
"require_debug_true": {
"()": "django.utils.log.RequireDebugTrue",
},
},
"handlers": {
"console": {
"level": "DEBUG",
"filters": ["require_debug_true"],
"class": "logging.StreamHandler",
"formatter": "simple"
},
"file_handle": {
"class": "logging.FileHandler",
"filename": os.path.join(BASE_DIR, "logs", "webResty2.log"),
"formatter": "console"
},
"django_handle": {
"class": "logging.FileHandler",
"filename": os.path.join(BASE_DIR, "logs", "django.log"),
"formatter": "console"
},
"django_request_handler": {
"level": "DEBUG",
"class": "logging.handlers.RotatingFileHandler",
"filename": os.path.join(BASE_DIR, "logs", "request.log"),
"maxBytes": 1024 * 1024 * 5,
"backupCount": 5,
"formatter": "console",
},
"mail":{
"class": "logging.handlers.SMTPHandler",
"level": "ERROR",
"formatter": "simple",
"mailhost":("smtp.139.com", 25),
"fromaddr":"xxxxx@139.com",
"toaddrs":["xxxxx@qq.com"],
"subject" : "devops mail",
"credentials" :("xxxx@139.com","password")
}
},
'formatters': {
'console':{
'format': '[%(asctime)s] [%(process)d] [%(thread)d] [%(filename)8s:%(lineno)4d] [%(levelname)-6s] %(message)s'
},
'simple': {
'format': '%(asctime)s %(levelname)s %(message)s'
}
},
}
上面的logging配置主要定义了这么几件事情:
-
定义了配置文件的版本,当前版本号为1.0
-
定义了两个formatter:simple和console,分别表示两种文本格式。
-
定义了一个过滤器:RequireDebugTrue ,提供更细粒度的日志过滤功能,用于决定哪些日志记录将会被输出(其它的日志记录将会被忽略)
- 定义了五个处理器handlers:
- console
- file_handler
- django_handler
- django_request_handler
配置了三个logger:
- webresty2: 我定义的处理器,记录一些我需要看到的日志,在模块中指定logger:
logger = logging.getLogger('webResty2') - django.request: :django的request发生error会自动记录,然后使用debug将信息记录到文件,还有mail_admins将信息通过邮件发送给管理员。这里邮件的功能非常棒!并不是一个纯文本信息,而是一个html文件,和我们在浏览器看到的错误页面一模一样!要正常使用邮件功能需要像我一样配置一下上面的邮件发件人信息。我是直接去网易申请了一个邮箱。要格外注意三点:1.一定要去邮件服务商开启SMTP服务;2.不同的邮件服务商可能有一些特殊的设置,比如网易,会给你一个客户端授权码,这个才是密码,而不是网页的登录密码。3 注意服务商有没有对发信频率的限制。
- django: 全部的日志信息,
配置django-auto-ldap
安装
pip install python-ldap pip install pyldap # py3 # 安装 pip install django-auth-ldap
源码安装
python-ldap-2.4.12.tar.gz django-auth-ldap-1.1.4.tar.gz
问题: 1 error: Setup script exited with error: command 'x86_64-linux-gnu-gcc' failed with exit status $ sudo apt-get install python-dev $ sudo apt install python3-dev # py3 环境 2 can only concatenate tuple (not "NoneType") to tuple "Previous versions of Celery required a separate library to work with Django, but since 3.1 this is no longer the case. Django is supported out of the box now" 4+版本之后就不能使用 python manage.py celery 启动了,所以请看下一celery的版本,保持在3.1.26.post2
在线文档: https://django-auth-ldap.readthedocs.io/en/latest/install.html

浙公网安备 33010602011771号