Подтвердить что ты не робот

Как включить stacktrace в мою страницу Django 500.html?

Я запускаю Django 1.0, и я близок к развертыванию моего приложения. Таким образом, я изменил бы настройку DEBUG на False.

С учетом сказанного мне все равно хотелось бы включить stacktrace на мою страницу 500.html при возникновении ошибок. Таким образом, пользователи могут копировать и вставлять ошибки и легко отправлять их разработчикам.

Любые мысли о том, как лучше всего подойти к этой проблеме?

4b9b3361

Ответ 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 в шаблон, и ваши пользователи могут ссылаться на конкретную ошибку, не подвергая ее внутренности.