Красиво отформатированные страницы ошибок в Django

Опубликовал: Wednesday, January 18, 2024 в категории Django | Пока нет комментариев

Полюбуйтесь на только что созданное вами замечательное веб-приложение в последний раз, потому что сейчас мы его сломаем! Давайте сознательно внесем ошибку в файл views, ру, закомментировав несколько строк в представлении hours_ahead:

def hours_ahead(request, offset): tt try:

tt offset = int(offset) tt except ValueError:

# raise Http404()

dt = datetime.datetime.now() + datetime.timedelta(hours=offset)

html = "<html><body>4epe3 %s часов будет %s.</body></html>" % (offset, dt)

return HttpResponse(html)

Запустите сервер разработки и перейдите к URL /time/plus/З/. Вы увидите страницу ошибки, на которой присутствует очень много информации, в том числе сообщение об исключении TypeError в самом верху:

«unsupported type for timedelta hours component: Unicode» (неподдерживаемый тип для компонента timedelta hours: Unicode).

Так что же произошло? Дело в том, что функция datetime.timedelta ожидает, что параметр hours - целое число, а мы закомментировали код, который преобразует offset в целое. Поэтому datetime.timedelta возбудила исключение TypeError. Это типичная ошибка, которую рано или поздно допускает любой программист.

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

•      В начале страницы выводится основная информация об исключении: его тип, переданные исключению параметры (в данном случае сообщение «unsupported type»), файл, в котором оно возникло, и номер строки, содержащей ошибку.

•      Ниже основной информации отображается полная трассировка исключения. Она похожа на стандартную трассировку, которую выдает командный интерпретатор Python, но более интерактивна. Для каждого уровня стека (кадра) Django выводит имя файла, имя функции или метода, номер строки и исходный текст этой строки.

•      Щелкнув на строке исходного текста (темно-серого цвета), вы увидите контекст - несколько строк до и после той, где возникла ошибка.

•      Щелкните по любой из ссылок Local vars (Локальные переменные), расположенных под каждым кадром стека, чтобы посмотреть на таблицу всех локальных переменных и их значений в этом кадре в точке возникновения исключения. Эта отладочная информация может оказаться очень полезной.

•      Обратите внимание на ссылку Switch to copy-and-paste view (Переключение в режим копирования-вставки) ниже заголовка Traceback (Трассировка). Если щелкнуть по ней, то трассировка будет представлена в другом виде, упрощающем копирование и вставку. Это полезно, когда нужно передать информацию о трассировке исключения кому-то, кто может оказать техническую поддержку, например, ребятам в IRC-чате Django или подписчикам списка рассылки для пользователей Django.

•      Ниже находится кнопка Share this traceback or. a public Web site (Отправить эту трассировку на открытый веб-сайт), которая позволяет еде- лать то же самое одним щелчком мыши. Щелкните по ней, чтобы отправить трассировку на сайт http://www.dpaste.com/. В ответ вы получите уникальный URL, который сможете сообщить другим пользователям.

•      В следующем разделе Request information (Информация о запросе) содержится много информации о веб-запросе, который привел к ошибке: данные для запросов типа GET и POST, значения cookie и различная метаинформация, например, заголовки общего шлюзового интерфейса CGI. В приложении G приведен полный перечень всего, что содержится в объекте запроса.

•      Под разделом Request information находится раздел Settings (Параметры), в котором перечислены все параметры данного экземпляра Django. (Мы уже упоминали параметр R00T_URLC0NF и по ходу изложения встретимся и с другими параметрами Django. Полный перечень параметров представлен в приложении D.)

В некоторых частных случаях страница ошибок Django может содержать и больше информации, например, если речь идет об ошибках в шаблоне. Мы еще вернемся к этому вопросу, когда будем обсуждать систему шаблонов в Django. А пока раскомментируйте строки, относящиеся к offset = int(offset), чтобы восстановить работоспособность функции представления.

Вы относитесь к тем программистам, которые предпочитают выполнять отладку с помощью инструкций print, расставленных в стратегически важных местах? Аналогичный подход можно применять и в Django, используя страницы с сообщениями об ошибках вместо инструкций print. Если в любом месте представления вставить инструкцию assert False, то будет выдана страница ошибок. На ней вы сможете просмотреть значения локальных переменных и состояние программы. Этот прием продемонстрирован ниже, на примере представления hours_ahead:

def hours_ahead(request, offset): try:

offset = int(offset) except ValueError: raise Http404()

dt = datetime.datetime.now() + datetime.timedelta(hours=offset) assert False

html = "<html><body>4epe3 %s часов будет %s.</body></html>" % (offset, dt) return HttpResponse(html)

Напоследок отметим, что большая часть этой информации конфиденциальна, поскольку раскрывает внутреннюю организацию вашего кода и параметры настройки Django. Поэтому было бы неосмотрительно демонстрировать ее всему открытому Интернету. Злоумышленник может с ее помощью попытаться реконструировать ваше веб-приложение и нанести вред. Поэтому страница ошибок Django ото0ражается, только когда проект работает в режиме отладки. Как отключить режим отладки,

мы расскажем в главе 12. А пока просто имейте в виду, что любой вновь созданный проект Django автоматически начинает работать в режиме отладки. (Звучит знакомо? Страница «Page not found», описанная выше в этой главе, работает точно так же.)

Источник: Головатый А., Каплан-Мосс Дж. Django. Подробное руководство, 2-е издание. - Пер. с англ. - СПб.: Символ- Плюс, 2010. - 560 е., ил.

Похожие посты:

Комментировать

Your email address will not be published. Required fields are marked *