关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
特别声明:该篇博文包含动态Debug设置,日志设置,发送错误报告到邮箱设置等。在博文最后面有完整有效的设置。
1、关闭Debug模式
这段时间整个网站运行都没问题。准备要关闭调试模式了,毕竟调试模式响应速度相对有些慢。关闭调试模式可以加快访问速度,而且可以避免敏感的调试信息泄漏。
打开settings.py文件,把DEBUG设置False。接着还需要设置 ALLOWED_HOSTS (被运行的主机),如果这个设置的话,会提示错误。偷懒的人可以设置为 ALLOWED_HOSTS = ['*',] 。但这种不建议,不够安全。应该根据自己的域名来设置。我设置为 ALLOWED_HOSTS = ['yshblog.com','*.yshblog.com'] 。相关的设置可以查看Django Book中文翻译。
2、动态设置Debug模式
为了方便我开发和生产部署,不想每次都手动修改DEBUG这个值(好吧,我就是懒了)。导入socket模块,根据ip地址来设置。判断是否是192开头的IP地址。这个和Django Book里面说的不一样,判断IP地址要好一些。如下设置:
import socket if socket.gethostbyname(socket.gethostname())[:3]=='192': DEBUG = TEMPLATE_DEBUG = True else: DEBUG = TEMPLATE_DEBUG = False ALLOWED_HOSTS = ['yshblog.com','*.yshblog.com']
3、logging日志设置
关闭了Debug模式之后,如果发生错误,就不得而知了。这样肯定是不行的,需要再引入日志。 Django有自带的Log模块,需要在Settings.py文件里面配置一下。
这个日志模块我也是研究了很久才弄明白。可以参考一下这篇博文Django日志loggin模块。
这个日志配置,主要分为4个部分,formater(格式器)、handle(处理器)、filter(过滤器)、logger(日志管理器实例),在handles和filters分别设置处理器和过滤器是给loggers使用的,都可以设置多个。至于可以在views里面调用什么就暂时不用管了。设置写到文件中要注意写好路径。我是如下配置的:
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {#日志格式
'standard': {
'format': '%(asctime)s [%(threadName)s:%(thread)d] [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s'}
},
'filters': {#过滤器
},
'handlers': {#处理器
'null': {
'level': 'DEBUG',
'class': 'logging.NullHandler',
},
'debug': {#输出到文件
'level':'DEBUG',
'class':'logging.handlers.RotatingFileHandler',
'filename': os.path.join(BASE_DIR, "log",'debug.log'),#日志输出文件
'maxBytes':1024*1024*5,#文件大小
'backupCount': 5,#备份份数
'formatter':'standard',#使用哪种formatters日志格式
},
'console':{#输出到控制台
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'standard',
},
},
'loggers': {#logging管理器
'django': {
'handlers': ['console'],
'level': 'DEBUG',
'propagate': False
},
'django.request': {
'handlers': ['debug'],
'level': 'ERROR',
'propagate': True,
},
}
}把所有的debug信息输出到控制台,把error级别错误信息输出到文件。当然要先在django网站创建我设置的日志目录:log,要不然会出错。
4、添加404和500页面
当然,还需要添加404和500页面,默认返回的页面不好看。在模块根目录新建404.html和500.html文件,代码分别如下:
{#404#}
{% extends "base.html" %}
{% block title %}纳尼!404错误{% endblock %}
{% block content %}找不到页面…… (可能去火星旅游了){% endblock %}{#500#}
{% extends "base.html" %}
{% block title %}竟然出错了{% endblock %}
{% block content %}错误信息已经通知管理员{% endblock %}5、自动发送错误日志到邮箱
在Django book看到可以把错误日志信息发送到邮件。看到这个功能,我心痒的不得了。这个功能真好,可以及时知道错误信息。
查阅了相关资料,在日志logging中加了发送邮件处理器:
'handlers': {
#........前面还有之前设置的处理器
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
},
'loggers': {
'django': {
'handlers': ['console'],
'level': 'DEBUG',
'propagate': False
},
'django.request': {
'handlers': ['debug','mail_admins'],
'level': 'ERROR',
'propagate': True,
},
# 对于不在 ALLOWED_HOSTS 中的请求不发送报错邮件
'django.security.DisallowedHost': {
'handlers': ['null'],
'propagate': False,
},在Settings.py文件加了邮件相关设置:
ADMINS = (
('Haddy Yang','*******@163.com'),#设置管理员邮箱
)
#Email
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST= 'smtp.qq.com'#QQ邮箱SMTP服务器
EMAIL_PORT= 25 #QQ邮箱SMTP服务端口
EMAIL_HOST_USER = '**********@qq.com' #我的邮箱帐号
EMAIL_HOST_PASSWORD = '**************' #密码
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER为了测试是否可以发送邮件,在views.py某个方法写入如下代码:
from django.core.mail import send_mail #导入django发送邮件模块
send_mail('subject', 'message', '******@163.com', ['******@qq.com'],fail_silently=False)结果提示550错误 User has no permission 用户未被许可。查了一下,原来需要邮件开通SMTP服务。打开QQ邮箱,在设置,帐号里面开启SMTP服务。得到一个授权码,把这个授权码填到EMAIL_HOST_PASSWORD中。再测试一下,可以正常发送邮件。
接着,我模拟了一个500错误,我的管理员邮箱并没有收到任何邮件,好奇怪。应该是我设置的问题,反复仔细阅读了Django book。发现里面提到默认发件人是root@localhost,可以修改SERVER_EMAIL更改发件人。我尝试一下修改这个属性,结果可以正常收到错误信息的邮件。弄了很久,终于设置好了。从网上找到的资料,很多都不全面。
6、完整设置
我完整的设置如下:
import socket
#根据IP地址判断是否是开发环境
if socket.gethostbyname(socket.gethostname())[:3]=='192':
DEBUG = TEMPLATE_DEBUG = True
else:
DEBUG = TEMPLATE_DEBUG = False
ALLOWED_HOSTS = ['yshblog.com','*.yshblog.com'] #设置允许访问的主机
#管理员邮箱
ADMINS = (
('Haddy Yang','*******@163.com'),
)
#非空链接,却发生404错误,发送通知MANAGERS
SEND_BROKEN_LINK_EMAILS = True
MANAGERS = ADMINS
#Email设置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST= 'smtp.qq.com'#QQ邮箱SMTP服务器(邮箱需要开通SMTP服务)
EMAIL_PORT= 25 #QQ邮箱SMTP服务端口
EMAIL_HOST_USER = '**********@qq.com' #我的邮箱帐号
EMAIL_HOST_PASSWORD = '**************' #授权码
EMAIL_SUBJECT_PREFIX = 'website' #为邮件标题的前缀,默认是'[django]'
EMAIL_USE_TLS = True #开启安全链接
DEFAULT_FROM_EMAIL = SERVER_EMAIL = EMAIL_HOST_USER #设置发件人
#logging日志配置
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {#日志格式
'standard': {
'format': '%(asctime)s [%(threadName)s:%(thread)d] [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s'}
},
'filters': {#过滤器
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse',
}
},
'handlers': {#处理器
'null': {
'level': 'DEBUG',
'class': 'logging.NullHandler',
},
'mail_admins': {#发送邮件通知管理员
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'filters': ['require_debug_false'],# 仅当 DEBUG = False 时才发送邮件
'include_html': True,
},
'debug': {#记录到日志文件(需要创建对应的目录,否则会出错)
'level':'DEBUG',
'class':'logging.handlers.RotatingFileHandler',
'filename': os.path.join(BASE_DIR, "log",'debug.log'),#日志输出文件
'maxBytes':1024*1024*5,#文件大小
'backupCount': 5,#备份份数
'formatter':'standard',#使用哪种formatters日志格式
},
'console':{#输出到控制台
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'standard',
},
},
'loggers': {#logging管理器
'django': {
'handlers': ['console'],
'level': 'DEBUG',
'propagate': False
},
'django.request': {
'handlers': ['debug','mail_admins'],
'level': 'ERROR',
'propagate': True,
},
# 对于不在 ALLOWED_HOSTS 中的请求不发送报错邮件
'django.security.DisallowedHost': {
'handlers': ['null'],
'propagate': False,
},
}
}