Как включить stacktrace в мою страницу Django 500.html?
Я запускаю Django 1.0
, и я близок к развертыванию моего приложения. Таким образом, я изменил бы настройку DEBUG на False.
С учетом сказанного мне все равно хотелось бы включить stacktrace на мою страницу 500.html при возникновении ошибок. Таким образом, пользователи могут копировать и вставлять ошибки и легко отправлять их разработчикам.
Любые мысли о том, как лучше всего подойти к этой проблеме?
Ответы
Ответ 1
Автоматически регистрируйте 500-е, таким образом:
- Вы знаете, когда они происходят.
- Вам не нужно полагаться на пользователей, отправляющих ваши стеки.
Joel рекомендует даже зайти так далеко, как автоматически создавать билеты в вашем трекере ошибок, когда ваше приложение испытывает сбой. Лично я создаю (закрытый) RSS-канал с помощью стеков, URL-адресов и т.д., Которые разработчики могут подписаться.
Отображение трассировки стека для ваших пользователей, с другой стороны, может привести к утечке информации, которую злоумышленники могут использовать для атаки вашего сайта. Чрезмерно подробные сообщения об ошибках являются одним из классических шагов для атаки 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")
Ответ 2
Как говорит @zacherates, вы действительно не хотите отображать stacktrace для своих пользователей. Самый простой подход к этой проблеме - это то, что Django делает по умолчанию, если вы сами и ваши разработчики указали в настройке ADMINS с адресами электронной почты; он отправляет электронное письмо всем в этом списке с полной трассировкой стека (и более) каждый раз, когда есть ошибка 500 с DEBUG = False.
Ответ 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))))
# В Main 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
Ответ 4
Вы можете вызвать sys.exc_info()
в специальном обработчике исключений. Но я не рекомендую этого. Django может отправлять вам электронные письма для исключений.
Ответ 5
Я знаю, что это старый вопрос, но в эти дни я бы рекомендовал использовать такую услугу, как Sentry, чтобы зафиксировать ваши ошибки.
В Django шаги по настройке этого процесса невероятно просты. Из документы:
- Установите Raven с помощью
pip install raven
- Добавьте
'raven.contrib.django.raven_compat'
к вашему settings.INSTALLED_APPS
.
- Добавьте
RAVEN_CONFIG = {"dsn": YOUR_SENTRY_DSN}
в свои настройки.
Затем на вашей странице 500 (определенную в handler500
) передайте шаблон request.sentry.id
в шаблон, и ваши пользователи могут ссылаться на конкретную ошибку, не подвергая ее внутренности.