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