Как я могу заставить django показывать мне исключения из функций, вызываемых в шаблонах?

#django #exception #django-templates

#django #исключение #django-templates

Вопрос:

У Django есть (обычно прекрасное) поведение превращения исключений в шаблонах в пустые строки. Поэтому, если я это сделаю {{object.fn_which_throws_exception}} , я просто получу пустую строку. Но иногда я хотел бы узнать что-нибудь об исключении: есть ли какой-либо способ заставить django присутствовать или регистрировать детали таких исключений?

Ответ №1:

Если вы используете runserver , вы могли бы использовать pdb для пошагового выполнения кода.

Добавьте import pdb; pdb.set_trace() выше проблемный код. Перейдите по соответствующему URL в вашем браузере, и pdb должен приостановить выполнение и позволить вам пошагово просмотреть код построчно.

http://docs.python.org/library/pdb.html

Ответ №2:

Если вы работаете в своей среде разработки, убедитесь, что для DEBUG и TEMPLATE_DEBUG установлено значение True .

Если вы работаете в производственной среде, лучше всего добавить django-sentry в свой проект. Он отслеживает всю информацию, с которой вы могли бы работать DEBUG=True . Это абсолютно потрясающая программа, которая сэкономит вам бесконечное количество времени, когда что-то пойдет не так.

РЕДАКТИРОВАТЬ: О, и последнее. Вы всегда можете обернуть свой код в try... except блок и вернуть исключение таким образом:

 def fn_which_throws_exception():
    import sys
    try:
        # code that might raise exception
    except:
        return sys.exc_info()
  

Комментарии:

1. У меня для DEBUG и TEMPLATE_DEBUG установлено значение True (по умолчанию) — вы предполагаете, что это должно где-то предоставлять мне информацию об исключении?

2. Да, если возникло какое-либо исключение, и для обоих из них установлено значение true, вы должны получить страницу ошибки с обратной трассировкой.

3. Согласно документам django, TEMPLATE_DEBUG сообщает об исключениях TemplateSyntaxError, в отличие от исключений из функций, которые я вызываю из шаблона. По моим наблюдениям, он ничего не делает с исключениями в функциях, которые я вызываю из шаблона, вы действительно пробовали это?

4. Правильно, TEMPLATE_DEBUG просто охватывает исключения, встречающиеся при обработке тегов шаблона и тому подобное. Но DEBUG охватывает все остальное. Если у вас есть исключение, любое исключение, которое не обработано в вашем коде, оно должно сгенерировать страницу ошибки в режиме отладки.

5.code.djangoproject.com/ticket/6907 code.djangoproject.com/ticket/8031