django 1.8 官方文档翻译:6-6-5 错误报告
错误报告
当你运行一个公开站点时,你应该始终关闭DEBUG
设置。这会使你的服务器运行得更快,也会防止恶意用户看到由错误页面展示的一些应用细节。
但是,运行在 DEBUG
为False
的情况下,你不会看到你的站点所生成的错误 – 每个人都只能看到公开的错误页面。你需要跟踪部署的站点上的错误,所以可以配置Django来生成带有错误细节的报告。
报告邮件
服务器错误
DEBUG
为 False
的时候,无论什么时候代码产生了未处理的异常,并且出现了服务器内部错误(HTTP状态码 500),Django 都会给ADMINS
设置中的用户发送邮件。 这会向管理员提供任何错误的及时通知。 ADMINS
会得到一份错误的描述,完整的Python traceback,以及HTTP请求和导致错误的详细信息。
注意
为了发送邮件,DJango需要一些设置来告诉它如何连接到邮件服务器。最起码,你需要指定 EMAIL_HOST
,可能需要 EMAIL_HOST_USER
和EMAIL_HOST_PASSWORD
,尽管所需的其他设置可能也依赖于你的邮件服务器的配置。邮件相关设置的完整列表请见 Django设置文档。
Django通常从root@localhost发送邮件。但是一些邮件提供商会拒收所有来自这个地址的邮件。修改SERVER_EMAIL
设置可以使用不同的发信人地址。
将收信人的邮箱地址放入ADMINS
设置中来激活这一行为。
另见
服务器错误邮件使用日志框架来发送,所以你可以通过 自定义你的日志配置自定义这一行为。
404错误
也可以配置Django来发送关于死链的邮件(404”找不到页面”错误)。Django在以下情况发送404错误的邮件:
DEBUG
为False
;- 你的
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提供一套函数装饰器,来帮助你控制需要在生产环境(也就是DEBUG
为 False
的情况)中的错误报告中过滤的消息: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
, pw
和cc
变量的值会在错误报告中隐藏并且使用星号(****) 来代替,虽然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_word
和 credit_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_view
和auth
中的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'
你也可能会以更精细的方式来控制在提供的视图中使用哪种过滤器,通过设置 HttpRequest
的exception_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
。如果 DEBUG
为False
,通常过滤器是激活的。
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内建的错误处理器,只在DEBUG
为 False
时报告或记录错误是个好主意。
译者:Django 文档协作翻译小组,原文:Tracking code errors by email。
本文以 CC BY-NC-SA 3.0 协议发布,转载请保留作者署名和文章出处。
Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。交流群:467338606。
django 1.8 官方文档翻译:6-6-5 错误报告相关推荐
- django 1.8 官方文档翻译: 2-5-7 自定义查找
自定义查找 New in Django 1.7. Django为过滤提供了大量的内建的查找(例如,exact和icontains).这篇文档阐述了如何编写自定义查找,以及如何修改现存查找的功能.关于查 ...
- django 1.8 官方文档翻译:13-3 日志
日志 日志快速入门 Django 使用Python 内建的logging 模块打印日志.该模块的用法在Python 本身的文档中有详细的讨论.如果你从来没有使用过Python 的logging 框架( ...
- django 1.8 官方文档翻译:5-1-2 表单API
表单 API 关于这篇文档 这篇文档讲述Django 表单API 的详细细节.你应该先阅读表单简介. 绑定的表单和未绑定的表单 表单要么是绑定的,要么是未绑定的. 如果是绑定的,那么它能够验证数据,并 ...
- django 1.8 官方文档翻译: 3-6-2 内建的中间件
Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质. 交流群:467338606 网站:http://python.usyiyi.cn/django/index.html ...
- django 1.8 官方文档翻译: 2-5-6 多数据库
多数据库 这篇主题描述Django 对多个数据库的支持.大部分Django 文档假设你只和一个数据库打交道.如果你想与多个数据库打交道,你将需要一些额外的步骤. 定义你的数据库 在Django中使用多 ...
- django 1.8 官方文档翻译: 1-1-2 快速安装指南
快速安装指南 在你开始使用 Django 之前,你需要先安装它.我们有一个 完整安装指南 它涵盖了所有的安装步骤和可能遇到的问题:本指南将会给你一个最简单.简洁的安装指引. 安装 Python 作为一 ...
- django 1.8 官方文档翻译: 3-4-2 基于类的内建通用视图
基于类的内建通用视图 编写Web应用可能是单调的,因为你需要不断的重复某一种模式. Django尝试从model和 template层移除一些单调的情况,但是Web开发者依然会在view(视图)层经历 ...
- django 1.8 官方文档翻译:2-5-9 条件表达式
条件表达式 New in Django 1.8. 条件表达式允许你在过滤器.注解.聚合和更新操作中使用 if ... elif ... else的逻辑.条件表达式为表中的每一行计算一系列的条件,并且返 ...
- django 1.8 官方文档翻译:8-5 加密签名
加密签名 web应用安全的黄金法则是,永远不要相信来自不可信来源的数据.有时通过不可信的媒介来传递数据会非常方便.密码签名后的值可以通过不受信任的途径传递,这样是安全的,因为任何篡改都会检测的到. D ...
最新文章
- JavaScript中的+0与-0
- 做好准备迎接崭新的BCH了吗?
- Camstasia studio渲染(生成)视频
- APP上线后,去除Log打印的问题
- 博士申请 | 北京理工大学张睿恒老师组招收计算机视觉方向硕士/博士生
- python os模块 常用命令
- jdbc如何写csv文件_Java:将JDBC结果集作为CSV流化
- MATLAB飞机大战第二版,windows程序设计——飞机大战札记(单文档文件登陆界面)...
- PHP本地服务器localhost与数据库MySQL的综合运用
- 订单金额等字段设置decimal时,要禁止为负数
- vb把窗体嵌入桌面底层_桌面透明便签插件便签软件
- C风格简易本地log系统
- JavaWeb图书管理系统+论文+答辩ppt
- 作为一个新人,怎样学习嵌入式Linux?(转自韦东山)
- 计算机二级vb上机操作题库,2017年3月计算机二级VB上机操作题库及答案
- 网络规划设计师教程第二版目录
- WinSCP(Windows与Linux文件同步工具)使用总结
- linux系统可以安装浩辰CAD,浩辰CAD Linux下载
- 基于sklearn实现Bagging算法(python)
- android系统优化启动时间(Google官方推荐)
热门文章
- Android 文件下载--普通单线程下载文件
- Python/Numpy之点积叉积内积外积张量积
- cf 737 div2
- win10计算机重新启动,解决方法:为什么win10计算机在关闭后会自动重新启动
- This Android SDK requires Android Developer Toolkit version 23.0.0 or above.
- 【Ansys Workbench】DesignModeler和SpaceClam的参数化建模
- 【自动驾驶模拟器AirSim快速入门 | 04】推理预测及模拟器运行
- 不撞南墙不回头----------深度优先搜索
- yolo生成和训练数据集
- MyEclipse 9.0正式版官网下载(附Win+Llinux激活方法、汉化包)