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

时间:2008-09-23 14:39:36

标签: python django templates stack-trace

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

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

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

5 个答案:

答案 0 :(得分:16)

以这种方式自动记录您的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")

答案 1 :(得分:11)

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

答案 2 :(得分:2)

如果我们想在你的模板(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))))

#在Main urls.py中:

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

#在模板(500.html)中:

{{ exception_value }}{{value}}{{tb}}

更多相关信息:https://docs.djangoproject.com/en/dev/topics/http/views/#the-500-server-error-view

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我知道这是一个老问题,但是现在我建议使用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传递给模板,您的用户可以引用特定错误,而不会泄露任何内部信息。