当你正在运行一个公共的站点的时候,你应该关掉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):返回过滤后的给定回溯框架的本地变量的字典,敏感信息用*号替换

最新文章

  1. Java中关于String类型的10个问题
  2. [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  3. 高级javascript---模块化编程
  4. 学习linux之用mail命令发邮件
  5. 是德科技完成对Anite的收购
  6. june 14
  7. Spring配置文件解析--bean属性
  8. React Native学习笔记-1:JSC profiler is not supported.(转载)
  9. 无法打开SQL Server的连接
  10. (转)Ubuntu中让终端对于历史输出的内容保持足够长
  11. contact表单错误解决记录
  12. DevOps之基础设施
  13. linux上安装redis的踩坑过程2
  14. B20J_2733_[HNOI2012]永无乡_权值线段树合并
  15. Fiddler 安装与配置
  16. IntelliJ IDEA 基础设置
  17. laravel中生成支付宝 二维码 扫码支付
  18. MyBatis基本配置和实践(五)
  19. Linux iptables常用命令
  20. 【招聘需求】前端开发/PHP工程师【往全栈发展】

热门文章

  1. POJ. 1005 I Think I Need a Houseboat(水 )
  2. 非代码抽取的dex加固脱壳
  3. POJ 1661 DP
  4. Sublime Text 配置python文件
  5. Android 一些系统参数的获取
  6. [技巧篇]05.关于eclipse模版
  7. mysql5.6以上(适用5.7)免安装版本 终极配置
  8. 查看自己电脑外网IP
  9. frame外弹出,刷新父页面
  10. Lodash js数据操作库