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

问题描述 投票:21回答:5

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

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

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

python django templates stack-trace
5个回答
16
投票

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

  • 你知道它们何时发生。
  • 您不需要依赖发送堆栈跟踪的用户。

Joel建议甚至在应用程序出现故障时自动在错误跟踪器中创建票证。就个人而言,我使用开发人员可以订阅的stacktraces,url等创建(私有)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")

11
投票

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


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))))

#在主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


1
投票

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


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传递给模板,您的用户可以引用特定错误,而不会暴露任何内部。

© www.soinside.com 2019 - 2024. All rights reserved.