25

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

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

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

4

5 回答 5

18

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

  • 你知道它们什么时候发生。
  • 您不需要依赖用户向您发送堆栈跟踪。

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")
于 2008-09-23T14:44:50.810 回答
11

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

于 2008-09-23T17:32:19.267 回答
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 }}{{value}}{{tb}}

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

于 2013-07-05T07:50:53.047 回答
1

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

于 2008-09-23T14:46:22.880 回答
0

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

在 Django 上,设置它的步骤非常简单。从文档

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

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

于 2016-03-09T10:53:22.643 回答