第11章 常用工具

  • 认证
  • 缓存
  • 日志
  • 邮件
  • rss
  • 分页
  • 消息框架
  • 序列化
  • 会话
  • 站点地图
  • 静态文件管理
  • 数据校验

Django的缓存框架

Django提供了不同级别的缓存粒度:

  • 您可以缓存特定视图的输出,
  • 您只能缓存难以生成的片段,
  • 或者可以缓存整个站点。

设置缓存

缓存系统需要少量的设置。也就是说,您必须告诉它缓存的数据应存放在哪里 - 无论是在数据库中,在文件系统中还是直接在内存中。

django支持的缓存类型

  • memchaced
  • 数据库缓存
  • 文件系统缓存
  • 本地内存缓存(默认缓存)- 进程和线程安全的。
  • 虚拟缓存(用于开发)
  1. # settings.py
  2. # memcached
  3. CACHES = {
  4. 'default': {
  5. 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
  6. 'LOCATION': '127.0.0.1:11211',
  7. }
  8. }
  9. # 数据库缓存
  10. # 在使用数据库缓存之前,必须创建缓存表 python manage.py createcachetable
  11. CACHES = {
  12. 'default': {
  13. 'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
  14. 'LOCATION': 'my_cache_table',
  15. }
  16. }
  17. #文件系统缓存
  18. CACHES = {
  19. 'default': {
  20. 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
  21. 'LOCATION': '/var/tmp/django_cache',
  22. }
  23. }
  24. # 本地内存缓存
  25. CACHES = {
  26. 'default': {
  27. 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
  28. 'LOCATION': 'unique-snowflake',
  29. }
  30. }

缓存设置项参数

缓存项 说明
TIMEOUT 默认300s,用于缓存的默认超时时间(以秒为单位)
OPTIONS 应该传递给缓存后端的任何选项

MAX_ENTRIES
CULL_FREQUENCY
|
| KEY_PREFIX | 一个字符串,将自动包含在Django服务器使用的所有缓存键中(默认预置)。 |
| VERSION | 由Django服务器生成的缓存键的默认版本号。 |
| KEY_FUNCTION | 包含指向函数的虚线路径的字符串,该函数定义如何将最前面的缓存键,版本和键组成一个前缀,版本和键。 |

以下示例中,正在配置文件系统后端,其超时时间为60秒,最大容量为1000个项目:

  1. CACHES = {
  2. 'default': {
  3. 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
  4. 'LOCATION': '/var/tmp/django_cache',
  5. 'TIMEOUT': 60,
  6. 'OPTIONS': {
  7. 'MAX_ENTRIES': 1000
  8. }
  9. }
  10. }

django日志系统

Django对于日志输出的信息是很完善的,request的信息,setting配置,trackback的信息,一应俱全,足够我们调试了。但是在线上环境,如果让用户看到这些信息,是很不安全的(暴露代码)。所以在线上我们要关闭Debug,但是又不能扔掉这些调试信息,这就要用到logging模块。

logging模块其实是Python的模块,在Django中有很多本地化的支持。

在Python的logging模块中,主要包含下面四大金刚:

备注
Loggers 记录器
Handlers 处理器
Filters 过滤器
Formatters 格式化器

logging模块定义了下表所示的日志级别,按事件严重程度由低到高排列(注意是全部大写!因为它们是常量。):

级别 级别数值 使用时机
CRITICAL 50 严重错误,程序已不能继续运行。
ERROR 40 由于更严重的问题,程序已不能执行一些功能了。
WARNING 30 警告用户,虽然程序还在正常工作,但有可能发生错误。
INFO 20 程序正常运行过程中产生的一些信息。
DEBUG 10 详细信息,常用于调试。

理解Logger

首先要理解logging的工作,这里面主要有四个东西:格式器formatter,过滤器filter,处理器handler,日志实例logger。

  1. formatter
  2. logger ----> handler ----------------> files, emails
  3. filter

处理流程是这样的。首先,在代码中。我们拿到的是logger实例,通过这个实例来记录信息。

  1. # import the logging library
  2. import logging
  3. # Get an instance of a logger
  4. logger = logging.getLogger('django')
  5. def my_view(request, arg1, arg):
  6. ...
  7. if bad_mojo:
  8. # Log an error message
  9. logger.error('Something went wrong!')

然后,名字是django的这个logger就会把信息交给相应的handler,handler把信息用formater和filter处理一下,提交log(保存到文件,数据库,或者发送邮件)。

一般来说,handler 可以是send_email,error_file等负责处理的方式,在logger中可以重复使用handler。例如我们的django处理器使用了send_email, error_file 这两个处理器,request处理器使用error_file,info_file两个处理器,logger和handler可以理解成多对多的关系,嘻嘻。

配置方式

Python中可以使用多种格式配置logging,比如.conf, .ini 等。

在Django中,我们是把有关logging的配置写到settings里面。相应的配置及解释如下(仅供参考)。

  1. #管理员邮箱
  2. ADMINS = (
  3. ('laixintao','*******@163.com'),
  4. )
  5. #非空链接,却发生404错误,发送通知MANAGERS
  6. SEND_BROKEN_LINK_EMAILS = True
  7. MANAGERS = ADMINS
  8. #Email设置
  9. EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
  10. EMAIL_HOST= 'smtp.163.com'#QQ邮箱SMTP服务器(邮箱需要开通SMTP服务)
  11. EMAIL_PORT= 25 #QQ邮箱SMTP服务端口
  12. EMAIL_HOST_USER = '**********@163.com' #我的邮箱帐号
  13. EMAIL_HOST_PASSWORD = '**************' #授权码
  14. EMAIL_SUBJECT_PREFIX = 'website' #为邮件标题的前缀,默认是'[django]'
  15. EMAIL_USE_TLS = True #开启安全链接
  16. DEFAULT_FROM_EMAIL = SERVER_EMAIL = EMAIL_HOST_USER #设置发件人
  17. #logging日志配置
  18. LOGGING = {
  19. 'version': 1,
  20. 'disable_existing_loggers': True,
  21. 'formatters': {#日志格式
  22. 'standard': {
  23. 'format': '%(asctime)s [%(threadName)s:%(thread)d] [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s'}
  24. },
  25. 'filters': {#过滤器
  26. 'require_debug_false': {
  27. '()': 'django.utils.log.RequireDebugFalse',
  28. }
  29. },
  30. 'handlers': {#处理器
  31. 'null': {
  32. 'level': 'DEBUG',
  33. 'class': 'logging.NullHandler',
  34. },
  35. 'mail_admins': {#发送邮件通知管理员
  36. 'level': 'ERROR',
  37. 'class': 'django.utils.log.AdminEmailHandler',
  38. 'filters': ['require_debug_false'],# 仅当 DEBUG = False 时才发送邮件
  39. 'include_html': True,
  40. },
  41. 'debug': {#记录到日志文件(需要创建对应的目录,否则会出错)
  42. 'level':'DEBUG',
  43. 'class':'logging.handlers.RotatingFileHandler',
  44. 'filename': os.path.join(BASE_DIR, "log",'debug.log'),#日志输出文件
  45. 'maxBytes':1024*1024*5,#文件大小
  46. 'backupCount': 5,#备份份数
  47. 'formatter':'standard',#使用哪种formatters日志格式
  48. },
  49. 'console':{#输出到控制台
  50. 'level': 'DEBUG',
  51. 'class': 'logging.StreamHandler',
  52. 'formatter': 'standard',
  53. },
  54. },
  55. 'loggers': {#logging管理器
  56. 'django': {
  57. 'handlers': ['console'],
  58. 'level': 'DEBUG',
  59. 'propagate': False
  60. },
  61. 'django.request': {
  62. 'handlers': ['debug','mail_admins'],
  63. 'level': 'ERROR',
  64. 'propagate': True,
  65. },
  66. # 对于不在 ALLOWED_HOSTS 中的请求不发送报错邮件
  67. 'django.security.DisallowedHost': {
  68. 'handlers': ['null'],
  69. 'propagate': False,
  70. },
  71. }
  72. }

以上的配置文件中,有三个日志处理器。分别是:

  1. django.request:django的request发生error会自动记录,然后使用debug将信息记录到文件,还有mail_admins将信息通过邮件发送给管理员。这里邮件的功能非常棒!并不是一个纯文本信息,而是一个html文件,和我们在浏览器看到的错误页面一模一样!要正常使用邮件功能需要像我一样配置一下上面的邮件发件人信息。我是直接去网易申请了一个邮箱。要格外注意三点:
    1. 一定要去邮件服务商开启SMTP服务;
    2. 不同的邮件服务商可能有一些特殊的设置,比如网易,会给你一个客户端授权码,这个才是密码,而不是网页的登录密码。
    3. 注意服务商有没有对发信频率的限制。
  2. django:使用console处理器,将信息输出。在开发的时候就可以使用这个处理器(什么?print? 太low了!)
  3. 最后一个处理器见注释。django.security.DisallowedHost, 对于不在 ALLOWED_HOSTS 中的请求不发送报错邮件

最后,不要忘了给日志的路径响应的权限。比如Apache2服务器,就需要给www-data写权限:

  1. sudo chown -R [yourname]:www-data [log]
  2. sudo chmod -R g+s [log]

django对logging的扩展

记录器 Loggers

Django额外提供了几个其内建的logger。

  • django: 不要使用这个记录器,用下面的。这是一个被供起来的记录器,
  • django.request: 记录与处理请求相关的消息。5XX错误被记录为ERROR消息;4XX错误记录为WARNING消息。接收额外参数:status_code和request
  • django.server: 记录开发服务器下处理请求相关的消息。只用于开发阶段。
  • django.template: 记录与渲染模板相关的日志。
  • django.db.backends: 与数据库交互的代码相关的消息。
  • django.security: 记录任何与安全相关的错误。
  • django.security.csrf: 记录CSRF验证失败日志。
  • django.db.backends.schema: 记录查询导致数据库修改的日志。

处理器 Handlers

Django额外提供了一个handler,AdminEmailHandler。这个处理器将它收到的每个日志信息用邮件发送给站点管理员。

过滤器Filters

Django还额外提供两个过滤器。

  • CallbackFilter(callback)[source]:这个过滤器接受一个回调函数,并对每个传递给过滤器的记录调用它。如果回调函数返回False,将不会进行记录的处理。
  • RequireDebugFalse[source]: 这个过滤器只会在settings.DEBUG==False时传递。

参考资料

  1. python logging模块使用教程
  2. Django文档 – logging
  3. 我的网站搭建(第12天) 关闭调试
  4. https://www.kawabangga.com/posts/1878