Сообщение об ошибке Django слишком длинное. Как мне его обрезать?

Кажется, что сообщения об ошибках в Django 1.9 намного длиннее, чем раньше. Для «настроек» есть целый раздел, который я считаю излишним и потенциально слишком показательным.

Каков наилучший способ отредактировать электронное письмо об ошибке, которое отправляет Django?

редактировать: я не просто пытаюсь скрыть конфиденциальную информацию. В Django 1.9 в электронной почте намного больше контента, и я хочу изменить формат электронной почты, чтобы он был короче. Мне понравилось по старинке.


person AlexH    schedule 22.03.2016    source источник
comment
Вы смотрели здесь: https://docs.djangoproject.com/es/1.9/howto/error-reporting/#filtering-sensitive-information   -  person niklas    schedule 23.03.2016
comment
Это также должно прояснить для вас ситуацию: docs.djangoproject.com/en /1.9/ref/settings/#debug — все токены, содержащие API, TOKEN, KEY, SECRET, PASS или SIGNATURE, будут автоматически скрыты.   -  person karthikr    schedule 23.03.2016
comment
Есть два вопроса, которые я нашел похожими на ваш: stackoverflow.com/questions/27411362/ и stackoverflow.com/questions/12301105/ что приводит к тому, что сказал @niklas.   -  person Panta Cuzino    schedule 23.03.2016
comment
Всем привет! Я не собираюсь скрывать конфиденциальную информацию. Отладочная электронная почта стала намного длиннее в Django 1.9, и мне понравилось то, что было раньше. Где находится шаблон, на котором основано электронное письмо?   -  person AlexH    schedule 23.03.2016


Ответы (2)


В представлении отладки django есть переменная шаблона TECHNICAL_500_TEMPLATE/TECHNICAL_500_TEXT_TEMPLATE. , который управляет тем, что отображается в отчетах об ошибках и, конечно же, в сообщениях электронной почты об ошибках. В комментарии поясняется, что шаблон находится в переменной Python, поэтому в случае поломки загрузчика шаблона могут генерироваться ошибки. Вы можете изменить эту переменную в своем пакете django, но я не рекомендую этого делать. На TECHNICAL_500_TEMPLATE ссылается класс ExceptionReporter в том же файле.

Затем класс AdminEmailHandler в журнале django utils использует ExceptionReporter для создания отчета об ошибках html.

Вы можете создать подкласс AdminEmailHandler и переопределить функцию emit, чтобы включить вашу версию подкласса ExceptionReporter, которая использует определенный вами TECHNICAL_500_TEMPLATE.

Вот пример:

Создать reporter.py с

from copy import copy

from django.views import debug
from django.utils import log
from django.conf import settings
from django import template

TECHNICAL_500_TEMPLATE = """
    # custom template here, copy the original and make adjustments
"""
TECHNICAL_500_TEXT_TEMPLATE = """
    # custom template here, copy the original and make adjustments
"""

class CustomExceptionReporter(debug.ExceptionReporter):
    def get_traceback_html(self):
        t = debug.DEBUG_ENGINE.from_string(TECHNICAL_500_TEMPLATE)
        c = template.Context(self.get_traceback_data(), use_l10n=False)
        return t.render(c)

    def get_traceback_text(self):
        t = debug.DEBUG_ENGINE.from_string(TECHNICAL_500_TEXT_TEMPLATE)
        c = template.Context(self.get_traceback_data(), autoescape=False, use_l10n=False)
        return t.render(c)

class CustomAdminEmailHandler(log.AdminEmailHandler):
    def emit(self, record):
        try:
            request = record.request
            subject = '%s (%s IP): %s' % (
                record.levelname,
                ('internal' if request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS
                 else 'EXTERNAL'),
                record.getMessage()
            )
        except Exception:
            subject = '%s: %s' % (
                record.levelname,
                record.getMessage()
            )
            request = None
        subject = self.format_subject(subject)

        no_exc_record = copy(record)
        no_exc_record.exc_info = None
        no_exc_record.exc_text = None

        if record.exc_info:
            exc_info = record.exc_info
        else:
            exc_info = (None, record.getMessage(), None)

        reporter = CustomExceptionReporter(request, is_email=True, *exc_info)
        message = "%s\n\n%s" % (self.format(no_exc_record), reporter.get_traceback_text())
        html_message = reporter.get_traceback_html() if self.include_html else None
        self.send_mail(subject, message, fail_silently=True, html_message=html_message)

А затем просто настройте параметры django для использования нового обработчика в разделе ведения журнала. .

LOGGING = {
    # Your other logging settings
    # ...
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'class': 'project.reporter.CustomAdminEmailHandler',
            'filters': ['special']
        }
    },
}

Если вы просто хотите скрыть настройки, вы можете закомментировать 'settings': get_safe_settings(), строку 294, если вы переопределите и скопируете и вставите def get_traceback_data(self): в свой CustomExceptionReporter

person Airith    schedule 03.04.2016

Для тех, кто все еще ищет ответ сейчас:

В django 3.0 они добавили возможность добавлять reporter_class, которые настраивают только тело письма и рендеринг текста трассировки.

Итак, если вы просто хотите изменить шаблон электронной почты, нет необходимости также переопределять файл AdminEmailHandler.

поэтому, основываясь на ответе @Airith, вам необходимо:

# custom_exception_reporter.py

from django.views import debug
from django import template

TECHNICAL_500_TEXT_TEMPLATE = """ 
# custom template here, copy the original and make adjustments 
"""

class CustomExceptionReporter(debug.ExceptionReporter):
    def get_traceback_text(self):
        t = debug.DEBUG_ENGINE.from_string(TECHNICAL_500_TEXT_TEMPLATE)
        c = template.Context(self.get_traceback_data(), autoescape=False, use_l10n=False)
        return t.render(c)

а затем в вашей конфигурации журнала:

'handlers': {
        'mail_admins': {
             'level': 'ERROR',
             'class': 'django.utils.log.AdminEmailHandler',
             'include_html': False,
             'reporter_class': 'project.custom_exception_reporter.CustomExceptionReporter'
        },

Два примечания:

  1. Если вы хотите также отправить тело письма в формате HTML, вам потребуется другой шаблон — TECHNICAL_500_TEMPLATE, новая функция — get_traceback_html() и установить include_html = True в конфигурации журнала. Также здесь вы должны скопировать шаблон django по умолчанию и просто изменить то, что вам нужно.
  2. Если вы хотите сохранить весь шаблон не в этом файле, а в другом файле .html, обратите внимание, что даже если вы поместите его в определенную вами директорию шаблона, он не найдет его. Я решил это, сохранив файл template.html в том же каталоге, что и файл .py пользовательского репортера.

пример моего custom_exception_report.py, где я храню шаблон в том же каталоге (как описано в примечании № 2):

import os
from django.views import debug
from django import template

TECHNICAL_500_TEXT_TEMPLATE = "technical_500.text"


class CustomExceptionReporter(debug.ExceptionReporter):
    def get_traceback_text(self):
        t = self._get_template(TECHNICAL_500_TEXT_TEMPLATE)
        c = template.Context(self.get_traceback_data(), autoescape=False, use_l10n=False)
        return t.render(c)

    @staticmethod
    def _get_template(template_name):
        dir_path = os.path.dirname(os.path.realpath(__file__))
        template_path = os.path.join(dir_path, template_name)
        with open(template_path, 'r') as fh:
            return debug.DEBUG_ENGINE.from_string(fh.read())

Подробнее о классе отчета можно прочитать в документации по django здесь

person lmaayanl    schedule 15.01.2020