我的网站搭建(第12天) 关闭调试

  • 发布时间:2016年1月21日 11:25
  • 作者:杨仕航
* 该文是基于Python2.7开发的,最新Python3.x和Django2.x视频教程可以前往 >> Django2.0视频教程

特别声明:该篇博文包含动态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,
        },
    } 
}

上一篇:Linux用xrandr设置双屏显示

下一篇:我的网站搭建(第11天) 博文搜索

评论列表

智慧如你,不想发表一下意见吗?

新的评论

清空