错误报告

当你运行一个公开站点时,你应该始终关闭DEBUG 设置。这会使你的服务器运行得更快,也会防止恶意用户看到由错误页面展示的一些应用细节。

但是,运行在 DEBUGFalse的情况下,你不会看到你的站点所生成的错误 – 每个人都只能看到公开的错误页面。你需要跟踪部署的站点上的错误,所以可以配置Django来生成带有错误细节的报告。

报告邮件

服务器错误

DEBUGFalse的时候,无论什么时候代码产生了未处理的异常,并且出现了服务器内部错误(HTTP状态码 500),Django 都会给ADMINS设置中的用户发送邮件。 这会向管理员提供任何错误的及时通知。 ADMINS会得到一份错误的描述,完整的Python traceback,以及HTTP请求和导致错误的详细信息。

注意

为了发送邮件,DJango需要一些设置来告诉它如何连接到邮件服务器。最起码,你需要指定 EMAIL_HOST ,可能需要 EMAIL_HOST_USEREMAIL_HOST_PASSWORD,尽管所需的其他设置可能也依赖于你的邮件服务器的配置。邮件相关设置的完整列表请见 Django设置文档

Django通常从root@localhost发送邮件。但是一些邮件提供商会拒收所有来自这个地址的邮件。修改SERVER_EMAIL设置可以使用不同的发信人地址。

将收信人的邮箱地址放入ADMINS设置中来激活这一行为。

另见

服务器错误邮件使用日志框架来发送,所以你可以通过 自定义你的日志配置自定义这一行为。

404错误

也可以配置Django来发送关于死链的邮件(404”找不到页面”错误)。Django在以下情况发送404错误的邮件:

  • DEBUGFalse
  • 你的MIDDLEWARE_CLASSES 设置含有 django.middleware.common.BrokenLinkEmailsMiddleware

如果符合这些条件,无论什么时候你的代码产生404错误,并且请求带有referer, Django 都会给MANAGERS中的用户发送邮件。 (It doesn’t bother to email for 404s that don’t have a referer – those are usually just people typing in broken URLs or broken Web ‘bots).

注意

BrokenLinkEmailsMiddleware 必须出现在其它拦截404错误的中间件之前,比如 LocaleMiddleware 或者 FlatpageFallbackMiddleware。把它放在你的MIDDLEWARE_CLASSES设置的最上面。

你可以通过调整IGNORABLE_404_URLS设置,告诉Django停止报告特定的404错误。它应该为一个元组,含有编译后的正则表达式对象。例如:

import re
IGNORABLE_404_URLS = (re.compile(r'\.(php|cgi)$'),re.compile(r'^/phpmyadmin/'),
)

在这个例子中,任何以.php 或者.cgi结尾URL的404错误都不会报告。任何以/phpmyadmin/开头的URL也不会。

下面的例子展示了如何排除一些浏览器或爬虫经常请求的常用URL:

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

(要注意这些是正则表达式,所以需要在句号前面添加反斜线来对它转义。)

如果你打算进一步自定义django.middleware.common.BrokenLinkEmailsMiddleware 的行为(比如忽略来自web爬虫的请求),你应该继承它并覆写它的方法。

另见

404错误使用日志框架来记录。通常,日志记录会被忽略,但是你可以通过编写合适的处理器和配置日志,将它们用于错误报告。

过滤错误报告

过滤敏感的信息

错误报告对错误的调试及其有用,所以对于这些错误,通常它会尽可能多的记录下相关信息。例如,通常DJango会为产生的异常记录完整的traceback,traceback 帧的每个局部变量,以及HttpRequest属性

然而,有时特定的消息类型十分敏感,并不适合跟踪消息,比如用户的密码或者信用卡卡号。所以Django提供一套函数装饰器,来帮助你控制需要在生产环境(也就是DEBUGFalse的情况)中的错误报告中过滤的消息:sensitive_variables()sensitive_post_parameters()

sensitive_variables(*variables)[source]

如果你的代码中一个函数(视图或者常规的回调)使用可能含有敏感信息的局部变量,你可能需要使用sensitive_variables 装饰器,来阻止错误报告包含这些变量的值。

from django.views.decorators.debug import sensitive_variables@sensitive_variables('user', 'pw', 'cc')
def process_info(user):pw = user.pass_wordcc = user.credit_card_numbername = user.name...

在上面的例子中,user, pwcc 变量的值会在错误报告中隐藏并且使用星号(****) 来代替,虽然name 变量的值会公开。

要想有顺序地在错误报告中隐藏一个函数的所有局部变量,不要向sensitive_variables 装饰器提供任何参数:

@sensitive_variables()
def my_function():...

使用多个装饰器的时候

如果你想要隐藏的变量也是一个函数的参数(例如,下面例子中的user),并且被装饰的函数有多个装饰器,你需要确保将@sensitive_variables 放在装饰器链的顶端。这种方法也会隐藏函数参数,尽管它通过其它装饰器传递:

@sensitive_variables('user', 'pw', 'cc')
@some_decorator
@another_decorator
def process_info(user):...

sensitive_post_parameters(*parameters)[source]

如果你的代码中一个视图接收到了可能带有敏感信息的,带有POST 参数HttpRequest对象,你可能需要使用sensitive_post_parameters  装饰器,来阻止错误报告包含这些参数的值。

from django.views.decorators.debug import sensitive_post_parameters@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'])...

在上面的例子中,pass_wordcredit_card_number POST参数的值会在错误报告中隐藏并且使用星号(****) 来代替,虽然name变量的值会公开。

要想有顺序地在错误报告中隐藏一个请求的所有POST 参数,不要向sensitive_post_parameters  装饰器提供任何参数:

@sensitive_post_parameters()
def my_view(request):...

所有POST参数按顺序被过滤出特定django.contrib.auth.views 视图的错误报告(login, password_reset_confirm, password_change, add_viewauth中的user_change_password),来防止像是用户密码这样的敏感信息的泄露。

自定义错误报告

所有sensitive_variables()  和 sensitive_post_parameters()分别用敏感变量的名字向被装饰的函数添加注解,以及用POST敏感参数的名字向HttpRequest对象添加注解,以便在错误产生时可以随后过滤掉报告中的敏感信息。Django的默认错误包告过滤器django.views.debug.SafeExceptionReporterFilter会完成实际的过滤操作。
产生错误报告的时候,这个过滤器使用装饰器的注解来将相应的值替换为星号 (****) 。如果你希望为你的整个站点覆写或自定义这一默认的属性,你需要定义你自己的过滤器类,并且通过DEFAULT_EXCEPTION_REPORTER_FILTER 设置来让Django使用它。

DEFAULT_EXCEPTION_REPORTER_FILTER = 'path.to.your.CustomExceptionReporterFilter'

你也可能会以更精细的方式来控制在提供的视图中使用哪种过滤器,通过设置 HttpRequestexception_reporter_filter属性。

def my_view(request):if request.user.is_authenticated():request.exception_reporter_filter = CustomExceptionReporterFilter()...

你的自定义过滤器类需要继承自 django.views.debug.SafeExceptionReporterFilter,并且可能需要覆写以下方法:

class SafeExceptionReporterFilter[source]

SafeExceptionReporterFilter.``is_active(request)[source]

如果其它方法中操作的过滤器已激活,返回True。如果 DEBUGFalse,通常过滤器是激活的。

SafeExceptionReporterFilter.``get_request_repr(request)

Returns the representation string of the request object, that is, the value that would be returned by repr(request), except it uses the filtered dictionary of POST parameters as determined by SafeExceptionReporterFilter.get_post_parameters().

SafeExceptionReporterFilter.``get_post_parameters(request)[source]

返回过滤后的POST参数字典。通常它会把敏感参数的值以星号 (****)替换。

SafeExceptionReporterFilter.``get_traceback_frame_variables(request, tb_frame)[source]

返回过滤后的,所提供traceback帧的局部变量的字典。通常它会把敏感变量的值以星号 (****)替换。

另见

你也可以通过编写自定义的exception middleware来建立自定义的错误报告。如果你编写了自定义的错误处理器,模拟Django内建的错误处理器,只在DEBUGFalse时报告或记录错误是个好主意。

译者:Django 文档协作翻译小组,原文:Tracking code errors by email。

本文以 CC BY-NC-SA 3.0 协议发布,转载请保留作者署名和文章出处。

Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。交流群:467338606。

django 1.8 官方文档翻译:6-6-5 错误报告相关推荐

  1. django 1.8 官方文档翻译: 2-5-7 自定义查找

    自定义查找 New in Django 1.7. Django为过滤提供了大量的内建的查找(例如,exact和icontains).这篇文档阐述了如何编写自定义查找,以及如何修改现存查找的功能.关于查 ...

  2. django 1.8 官方文档翻译:13-3 日志

    日志 日志快速入门 Django 使用Python 内建的logging 模块打印日志.该模块的用法在Python 本身的文档中有详细的讨论.如果你从来没有使用过Python 的logging 框架( ...

  3. django 1.8 官方文档翻译:5-1-2 表单API

    表单 API 关于这篇文档 这篇文档讲述Django 表单API 的详细细节.你应该先阅读表单简介. 绑定的表单和未绑定的表单 表单要么是绑定的,要么是未绑定的. 如果是绑定的,那么它能够验证数据,并 ...

  4. django 1.8 官方文档翻译: 3-6-2 内建的中间件

    Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质. 交流群:467338606 网站:http://python.usyiyi.cn/django/index.html ...

  5. django 1.8 官方文档翻译: 2-5-6 多数据库

    多数据库 这篇主题描述Django 对多个数据库的支持.大部分Django 文档假设你只和一个数据库打交道.如果你想与多个数据库打交道,你将需要一些额外的步骤. 定义你的数据库 在Django中使用多 ...

  6. django 1.8 官方文档翻译: 1-1-2 快速安装指南

    快速安装指南 在你开始使用 Django 之前,你需要先安装它.我们有一个 完整安装指南 它涵盖了所有的安装步骤和可能遇到的问题:本指南将会给你一个最简单.简洁的安装指引. 安装 Python 作为一 ...

  7. django 1.8 官方文档翻译: 3-4-2 基于类的内建通用视图

    基于类的内建通用视图 编写Web应用可能是单调的,因为你需要不断的重复某一种模式. Django尝试从model和 template层移除一些单调的情况,但是Web开发者依然会在view(视图)层经历 ...

  8. django 1.8 官方文档翻译:2-5-9 条件表达式

    条件表达式 New in Django 1.8. 条件表达式允许你在过滤器.注解.聚合和更新操作中使用 if ... elif ... else的逻辑.条件表达式为表中的每一行计算一系列的条件,并且返 ...

  9. django 1.8 官方文档翻译:8-5 加密签名

    加密签名 web应用安全的黄金法则是,永远不要相信来自不可信来源的数据.有时通过不可信的媒介来传递数据会非常方便.密码签名后的值可以通过不受信任的途径传递,这样是安全的,因为任何篡改都会检测的到. D ...

最新文章

  1. JavaScript中的+0与-0
  2. 做好准备迎接崭新的BCH了吗?
  3. Camstasia studio渲染(生成)视频
  4. APP上线后,去除Log打印的问题
  5. 博士申请 | 北京理工大学张睿恒老师组招收计算机视觉方向硕士/博士生
  6. python os模块 常用命令
  7. jdbc如何写csv文件_Java:将JDBC结果集作为CSV流化
  8. MATLAB飞机大战第二版,windows程序设计——飞机大战札记(单文档文件登陆界面)...
  9. PHP本地服务器localhost与数据库MySQL的综合运用
  10. 订单金额等字段设置decimal时,要禁止为负数
  11. vb把窗体嵌入桌面底层_桌面透明便签插件便签软件
  12. C风格简易本地log系统
  13. JavaWeb图书管理系统+论文+答辩ppt
  14. 作为一个新人,怎样学习嵌入式Linux?(转自韦东山)
  15. 计算机二级vb上机操作题库,2017年3月计算机二级VB上机操作题库及答案
  16. 网络规划设计师教程第二版目录
  17. WinSCP(Windows与Linux文件同步工具)使用总结
  18. linux系统可以安装浩辰CAD,浩辰CAD Linux下载
  19. 基于sklearn实现Bagging算法(python)
  20. android系统优化启动时间(Google官方推荐)

热门文章

  1. Android 文件下载--普通单线程下载文件
  2. Python/Numpy之点积叉积内积外积张量积
  3. cf 737 div2
  4. win10计算机重新启动,解决方法:为什么win10计算机在关闭后会自动重新启动
  5. This Android SDK requires Android Developer Toolkit version 23.0.0 or above.
  6. 【Ansys Workbench】DesignModeler和SpaceClam的参数化建模
  7. 【自动驾驶模拟器AirSim快速入门 | 04】推理预测及模拟器运行
  8. 不撞南墙不回头----------深度优先搜索
  9. yolo生成和训练数据集
  10. MyEclipse 9.0正式版官网下载(附Win+Llinux激活方法、汉化包)