如何在Django的500.html页面中包含堆栈跟踪?
我正在使用 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")