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

26 投票
5 回答
10846 浏览
提问于 2025-04-11 09:19

我正在使用 Django 1.0,快要把我的应用上线了。因此,我会把 DEBUG 设置改成 False。

不过,我还是想在出现错误时,在 500.html 页面上显示错误的详细信息。这样用户就可以复制这些错误信息,方便地发邮件给开发者。

有没有什么好的建议来解决这个问题呢?

5 个回答

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

11

正如@zacherates所说,你真的不想把错误信息直接展示给用户。解决这个问题最简单的方法就是像Django默认做的那样。如果你在ADMINS设置中列出了自己和你的开发者,并且提供了邮箱地址,那么每当出现500错误(也就是服务器内部错误)并且DEBUG设置为False时,它会把完整的错误信息(还有更多内容)通过邮件发送给列表中的每一个人。

19

自动记录你的500错误,这样做有几个好处:

  • 你能知道这些错误发生的时间。
  • 你不需要依赖用户来给你发送错误信息。

Joel建议,甚至可以在你的应用出现故障时,自动在你的缺陷追踪系统中创建问题单。就我个人而言,我会创建一个(私有的)RSS订阅源,里面包含错误信息、网址等,开发人员可以订阅这个源。

不过,把错误信息直接展示给用户可能会泄露一些信息,让恶意用户有机可乘,进而攻击你的网站。过于详细的错误信息往往是SQL注入攻击的一个经典前奏。

编辑(添加了捕获错误信息的代码示例):

你可以通过sys.exc_info来获取异常信息。而格式化错误信息以便显示则是通过traceback模块来完成的:

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

撰写回答