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

StackOverflow https://stackoverflow.com/questions/121439

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top