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