我正在运行Django 1.0
,我即将部署我的应用。因此,我将DEBUG设置更改为False。
话虽如此,我仍然希望在发生错误时将堆栈跟踪包含在我的500.html页面上。通过这样做,用户可以复制并粘贴错误,并轻松地通过电子邮件将其发送给开发人员。
有关如何最好地解决此问题的任何想法?
答案 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模板。
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))))
from django.conf.urls.defaults import *
handler500 = 'project.web.services.views.custom_500'
{{ 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)