当你正在运行一个公共的站点的时候,你应该关掉DEBUG设置。这将使你的服务器运行的更快,同时也能预防别有用心的用户从你的错误页面看到你应用的一些详细配置信息。然而,当debug为false的时候,你将永远看不到由你的站点产生的错误--所有人都只能看到你的公开的错误页面。出于你必须跟踪你部署的站点的错误,django可以配置成当那些错误发生的时候,创建这些错误汇报给你。

邮件汇报

服务器错误

当DEBUG设置为False的时候,无论什么时候你的代码引发一个处理不了的异常 然后导致服务器错误(500),django会给ADMINS设置里面的用户列表发送邮件。这使得管理员可以立刻知道任何错误的提示,邮件内容包含错误的描述,一个完整的python回溯和引发该错误的HTTP请求的详细信息。

注意的是,如果你想发送邮件成功的话,你还是要配置发送邮件需要的配置的,可以参考这个django Email

django默认以从root@loaclhost发送 邮件,然而,有些邮件提供商拒绝这个地址的所有邮件,所以你可以考虑配置SERVER_EMAIL

如果想禁用这个设置的话,直接把ADMINS配置移除就好

404错误

django也可以配置成当发生坏链的时候发送邮件(404错误),关于404错误,django会在下面情况成立的时候发送邮件

  • DEBUG设置为False
  • SEND_BROKEN_LINK_EMAILS设置为True
  • 设置了CommonMiddleware中间件(默认是有的)

如果这些条件被满足的话,当你的代码跑出了404错误并且该请求有引用者的时候(没有引用者的不发送),django会往配置文件中的MANAGERS列表中的用户发送邮件。

你可以通过调整IGNORABLE_404_URLS设置告诉django那些404s是不用汇报的,设置是一个编译的正则表达式对象的元组,下面是一个例子:

import re
IGNORABLE_404_URLS = (
re.compile(r'^/apple-touch-icon.*\.png$'),
re.compile(r'^/favicon\.ico$'),
re.compile(r'^/robots\.txt$'),
)

禁用这个行为的最好的方法是设置SEND_BROKEN_LINK_EMAILS为假

过滤错误汇报

过滤敏感信息

错误汇报对于debug来说是非常有用的,所以错误汇报能记录越多相关的信息越好。然而,一些特定类型的信息因为太敏感而最好不要去回溯,比如用户的密码和信用卡号。因此,django提供了一些的函数装饰器让你能够控制那些信息应该在产品环境从错误汇报中过滤掉:sensitive_variables()和sensitive_post_parameters()

sensitive_variables(*variables)

如果你的代码中的一些函数使用本地变量存储一些可能敏感的信息的时候,你可以是用这个装饰器预防这些变量的值出现在错误汇报上面,如果这个装饰器没有任何参数的话,那么所有的本次变量都会被过滤掉

from django.views.decorators.debug import sensitive_variables
#仅仅会过滤user,pw和cc
@sensitive_variables('user', 'pw', 'cc')
def process_info(user):
pw = user.pass_word
cc = user.credit_card_number
name = user.name
...
#过滤所有本地变量
@sensitive_variables()
def my_function():

sensitive_post_parameters(*parameters)

类似sensitive_variables(),这个装饰器过滤的对象是POST方法的HTTP请求的中的变量

from django.views.decorators.debug import sensitive_post_parameters
#仅仅过滤POST变量中的pass_word和credit_card_number
@sensitive_post_parameters('pass_word', 'credit_card_number')
def record_user_profile(request):
UserProfile.create(user=request.user,
password=request.POST['pass_word'],
credit_card=request.POST['credit_card_number'],
name=request.POST['name'])
...
#过滤所有
@sensitive_post_parameters()
def my_view(request):
...

自定义错误汇报

sensitive_variables()和sensitive_post_patameters()所做的仅仅是标识那些被过滤的参数,真正的过滤是由django的默认错误过滤器:django.views.debug.SafeExceptionReporterFilter完成的。这个过滤器使用那两个装饰器的提示把对应的值替换成****来达到过滤的效果。因此,如果你想自定义默认的过滤行为,你可以定义你的过滤器类,然后设置给DEFAULT_EXCEPTION_REPORTER_FILTER,或者在视图函数里面指定过滤器类

DEFAULT_EXCEPTION_REPORTER_FILTER = 'path.to.your.CustomExceptionReporterFilter'
#在视图函数里面使用
def my_view(request):
if request.user.is_authenticated():
request.exception_reporter_filter = CustomExceptionReporterFilter()
...

你的过滤器类必须继承SafeExceptionReporterFilter这个类并且可能需要覆盖以下方法:

is_active(self,request):如果DEBUG为False,返回真。仅当is_active为真,其他的过滤器操作才能被激活

get_request_repr(self,request):返回请求对象的代表字符串,就是是用repr(request)得到的值,不过其中的POST参数是使用get_post_patamteters()方法得到的

get_post_parameters(self,request):返回过滤后的POST参数字典,敏感信息用*号替换

get_traceback_frame_variables(self,request,tb_frame):返回过滤后的给定回溯框架的本地变量的字典,敏感信息用*号替换

django “如何”系列7:错误汇报的更多相关文章

  1. Python+Django+SAE系列教程17-----authauth (认证与授权)系统1

    通过session,我们能够在多次浏览器请求中保持数据,接下来的部分就是用session来处理用户登录了. 当然,不能仅凭用户的一面之词,我们就相信,所以我们须要认证. 当然了,Django 也提供了 ...

  2. Apache2.4部署django出现403 Forbidden错误解决办法

    前言:Apache2.4部署django出现403 Forbidden错误最好要结合apache中的错误日志来观察出现何种错误导致出现403错误 下午百度了一下午没找到解决办法,试了n种方法,简直坑爹 ...

  3. Django学习系列之Form基础

     Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...

  4. 智能合约语言 Solidity 教程系列9 - 错误处理

    这是Solidity教程系列文章第9篇介绍Solidity 错误处理. Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文 ...

  5. 一点理解之 CmBacktrace: ARM Cortex-M 系列 MCU 错误追踪库

    @2019-02-14 [小记] CmBacktrace: ARM Cortex-M 系列 MCU 错误追踪库,用来将单片机故障状态寄存器值翻译出来输出至终端上以便排错 CmBacktrace: AR ...

  6. django 分页出现 UnorderedObjectListWarning 错误

    django 分页出现此错误: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unorde ...

  7. 关于Django数据库mysql连接错误问题Connection to api@localhost failed. [08001] Could not create connection to d

    Connection to api@localhost failed. [08001] Could not create connection to d 错误类型 django连接mysql数据库错误 ...

  8. django 2.0 xadmin 错误集锦

    转载 django 2.0 xadmin 错误集锦 2018-03-26 10:39:18 Snail0Li 阅读数 5188更多 分类专栏: python   1.django2.0把from dj ...

  9. Django学习系列6:使用selenium测试用户交互

    学习系列5中的单元测试有报错信息,这儿来编写functional_tests.py文件,扩充其中的功能测试 # File: functional_test.py # Author: Rxf # Cre ...

随机推荐

  1. BZOJ4034:[HAOI2015]树上操作——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=4034 https://www.luogu.org/problemnew/show/P3178 有一棵 ...

  2. CodeForces 185A. Plant (矩阵快速幂)

    CodeForces 185A. Plant (矩阵快速幂) 题意分析 求解N年后,向上的三角形和向下的三角形的个数分别是多少.如图所示: N=0时只有一个向上的三角形,N=1时有3个向上的三角形,1 ...

  3. bzoj4552: [Tjoi2016&Heoi2016]排序(二分+线段树)

    又是久违的1A哇... 好喵喵的题!二分a[p],把大于mid的数改为1,小于等于mid的数改为0,变成01串后就可以用线段树进行那一连串排序了,排序后如果p的位置上的数为0,说明答案比mid小,如果 ...

  4. Mac 访问隐藏文件方法! 网上方法在我电脑上都不可用!

    百度的方法: 如果你想打开整个系统的隐藏文件可以在终端下输入以下命令 defaults write com.apple.finder AppleShowAllFiles -bool true 关闭显示 ...

  5. uboot两阶段代码分析

    1.启动过程特征总结(1)第一阶段为汇编阶段(start.s).第二阶段为C阶段(board.c中的start_armboot 函数)(2)第一阶段在SRAM中.第二阶段在DRAM中(3)第一阶段注重 ...

  6. JS设计模式之装饰者模式

    装饰者模式概述 在不改变原对象的基础上,通过对其进行包装拓展(添加属性或者方法)使原有对象可以满足用户更复杂的需求 实际需求 在已有的代码基础上,为每个表单中的input默认输入框上边显示一行提示文案 ...

  7. 第k小子集

    有n个数,共有2^n个子集,一个子集的值看做其所有数的和.求这2^n个子集中第K小的子集.n<=35. meet in the middle + 二分判定 注意在双指针逼近时,相等的数带来的影响 ...

  8. 数据结构:K-D树

    K-D树实际上是一棵高维二叉搜索树,与普通二叉搜索树不同的是,树中存储的是一些K维数据 普通的二叉搜索树是一维的,当推广到K维后,就是我们的K-D树了 在K-D树中跟二叉搜索树差不多,也是将一个K维的 ...

  9. Java反射中method.isBridge() 桥接方法

    桥接方法是 JDK 1.5 引入泛型后,为了使Java的泛型方法生成的字节码和 1.5 版本前的字节码相兼容,由编译器自动生成的方法.我们可以通过Method.isBridge()方法来判断一个方法是 ...

  10. jQuery中val()、text()、html()之间的差别

    一.括号里没有值时表示取值    val获取表单中的值: text获取对象中的文本内容,不包含html标签: html获取对象中的内容,包括html标签 <!DOCTYPE HTML> & ...