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