如何在我的 Django 500.html 页面中包含堆栈跟踪?

Posted

技术标签:

【中文标题】如何在我的 Django 500.html 页面中包含堆栈跟踪?【英文标题】:How do I include a stacktrace in my Django 500.html page? 【发布时间】:2010-09-12 09:29:07 【问题描述】:

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

话虽如此,当发生错误时,我仍然希望在我的 500.html 页面上包含堆栈跟踪。通过这样做,用户可以复制并粘贴错误并轻松地将它们通过电子邮件发送给开发人员。

对于如何最好地解决这个问题有什么想法吗?

【问题讨论】:

【参考方案1】:

以这种方式自动记录您的 500 次:

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

Joel 甚至建议在您的应用程序遇到故障时在您的错误跟踪器中自动创建故障单。就个人而言,我创建了一个(私人)RSS 提要,其中包含开发人员可以订阅的堆栈跟踪、网址等。

另一方面,向您的用户显示堆栈跟踪可能会泄露恶意用户可能用来攻击您的网站的信息。过于详细的错误消息是 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")

【讨论】:

啊...好点。您能否阐明每次发生 500 错误时记录的最佳方法(并包括堆栈跟踪)? 编辑添加了我如何处理日志堆栈跟踪:开发人员的私人 RSS 提要。 大多数时候,当我们在调试时,我们需要一个回溯和可重现的步骤。我们有追溯,但客户有可重现的步骤。通过某种消息将它们链接到用户是有帮助的。我们有没有办法向用户提供某种消息? 注意:我的计划是某种哈希,提供跟踪是个坏主意。【参考方案2】:

正如@zacherates 所说,您真的不想向您的用户显示堆栈跟踪。解决这个问题的最简单方法是,如果您在 ADMINS 设置中列出了您自己和您的开发人员的电子邮件地址,则 Django 默认会执行此操作;每次出现 DEBUG = False 的 500 错误时,它都会向该列表中的每个人发送一封电子邮件,其中包含完整的堆栈跟踪(以及更多信息)。

【讨论】:

这是收集堆栈跟踪信息 o 500 错误的最佳解决方案。只是不要忘记在您的 settings.py 中包含SERVER_EMAIL = "your@server.tld" 以防止电子邮件被标记为垃圾邮件。这里有更多信息docs.djangoproject.com/en/1.8/ref/settings/…【参考方案3】:

如果我们想在你的模板(500.html)上显示生成的异常,那么我们可以编写你自己的 500 视图,抓取异常并将其传递给你的 500 模板。

步骤:

#在views.py中:

import sys,traceback

def custom_500(request):
    t = loader.get_template('500.html')

    print sys.exc_info()
    type, value, tb = sys.exc_info()
    return HttpResponseServerError(t.render(Context(
        'exception_value': value,
        'value':type,
        'tb':traceback.format_exception(type, value, tb)
    ,RequestContext(request))))

# 在主 urls.py:

from django.conf.urls.defaults import *
handler500 = 'project.web.services.views.custom_500'

#在模板中(500.html):

 exception_value valuetb

在此处了解更多信息:https://docs.djangoproject.com/en/dev/topics/http/views/#the-500-server-error-view

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

我知道这是一个老问题,但最近我建议使用Sentry 之类的服务来捕获您的错误。

在 Django 上,设置它的步骤非常简单。来自the docs:

使用pip install raven 安装 Raven 将'raven.contrib.django.raven_compat' 添加到您的settings.INSTALLED_APPS。 将RAVEN_CONFIG = "dsn": YOUR_SENTRY_DSN 添加到您的设置中。

然后,在您的 500 页面(在 handler500 中定义)上,将 request.sentry.id 传递给模板,您的用户可以引用特定错误,而不会暴露您的任何内部信息。

【讨论】:

以上是关于如何在我的 Django 500.html 页面中包含堆栈跟踪?的主要内容,如果未能解决你的问题,请参考以下文章

Django 渲染模板 `500.html` 而不是 `404.html`

如何在我的用户页面(HTML)中创建 django Admin 的 url

如何在 CBV 的 django 分页中显示页面项目数?

如何使用 django(查询)在我的 html 中显示更多对象

如何使用 CBV 在我的所有 Django 模板中创建侧边栏?

检查页面500和404的测试用例