关于本站
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, }, } }