如何在Django 500.html页面中包含stacktrace?

时间:2020-03-06 14:36:11  来源:igfitidea点击:

我正在运行Django 1.0,并且即将部署我的应用程序。因此,我将DEBUG设置更改为False。

话虽这么说,当发生错误时,我仍然希望将stacktrace包含在我的500.html页面中。这样,用户可以复制并粘贴错误,并轻松通过电子邮件将其发送给开发人员。

关于如何最好地解决此问题的任何想法?

解决方案

通过以下方式自动记录500s:

  • 我们知道它们何时发生。
  • 我们无需依赖用户向我们发送堆栈跟踪。

Joel建议甚至在应用程序出现故障时自动在错误跟踪器中创建票证。我个人创建了一个(私有)RSS提要,其中包含开发人员可以订阅的stacktrace,url等。

另一方面,向用户显示堆栈跟踪信息可能会泄漏恶意用户可能用来攻击站点的信息。过于详细的错误消息是SQL注入攻击的经典垫脚石之一。

编辑(添加了代码示例以捕获回溯):

我们可以从sys.exc_info调用中获取异常信息。格式化用于显示的回溯来自回溯模块:

import traceback
import sys

try:
    raise Exception("Message")
except:
    type, value, tb = sys.exc_info()
    print >> sys.stderr,  type.__name__, ":", value
    print >> sys.stderr, '\n'.join(traceback.format_tb(tb))

印刷:

Exception : Message
  File "exception.py", line 5, in <module>
    raise Exception("Message")

我们可以在自定义异常处理程序中调用sys.exc_info()。但我不建议这样做。 Django可以向我们发送例外电子邮件。

正如@zacherates所说,我们确实不想向用户显示堆栈跟踪。解决此问题的最简单方法是,如果我们自己和开发人员在ADMINS设置中使用电子邮件地址列出,则Django在默认情况下会执行什么操作;每当DEBUG = False出现500错误时,它就会向该列表中的每个人发送包含完整堆栈跟踪(以及更多)的电子邮件。