Как включить трассировку стека в мою страницу Django 500.html? - PullRequest
21 голосов
/ 23 сентября 2008

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

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

Есть мысли о том, как лучше подойти к этому вопросу?

Ответы [ 5 ]

16 голосов
/ 23 сентября 2008

Автоматически регистрируйте ваши 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")
11 голосов
/ 23 сентября 2008

Как говорит @zacherates, вы действительно не хотите показывать трассировку стека своим пользователям. Самый простой подход к этой проблеме - это то, что Django делает по умолчанию, если вы и ваши разработчики указаны в настройке ADMINS с адресами электронной почты; он отправляет электронное письмо всем в этом списке с полной трассировкой стека (и более) каждый раз, когда возникает ошибка 500 с DEBUG = False.

2 голосов
/ 05 июля 2013

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

1 голос
/ 23 сентября 2008

Вы можете вызвать sys.exc_info() в пользовательском обработчике исключений. Но я не рекомендую это. Django может отправлять вам электронные письма для исключений.

0 голосов
/ 09 марта 2016

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

...