Django Book: страница ошибки Django

Автор: | 10/02/2015

django_logo_2Предыдущая часть.

Давайте отвлечёмся на минутку от разработки, и полюбуемся нашим прекрасным сайтом…

А теперь – нужно его поломать!

Давайте намеренно внесём ошибку в код Python, в файле views.py, закомментировав строку offset = int(offset) в функции hours_ahead:

def hours_ahead(request, offset):

    # try:
    #     offset = int(offset)
    # except ValueError:
    #     raise Http404()
    dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
    html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt)
    return HttpResponse(html)

Запустите сервер разработки, и откройте URL /time/plus/3/. Вы увидите страницу с ошибкой и очень много информации, включая сообщение TypeError в самом верху: “unsupported type for timedelta hours component: unicode“.

Что случилось? Фунция datetime.timedelta ожидает получить параметр hours в int(), однако мы закомментировали строку, которая выполняла преобразование переменной offset. Поэтому и возникла ошибка TypeError. Это классический пример минорного бага, с которым время от времени сталкивается любой программист.

Задача этого примера была в том, что бы продемонстрировать вам страницу ошибки Django. Потратьте немного времени на её изучение, что бы знать – какую информацию она вам предоставляет.

Вот некоторые моменты, которые стоит знать:

  • Вверху страницы отображается ключевая информация об исключении: тип, некоторые дополнительные параметры (в данном случае – сообщение “unsupported type“), файл, в котором было вызвано исключение, и соответствующий номер строки;
  • Под этой информацией на странице отображается полная трасисровка вызова Python до этой ошибки. Она похожа на стандартный traceback, как в командой строке, но немного более интерактивна. Для каждого уровня (“фрейма“) в стеке – Django отображает имя файла, имя функции или метода, номер строки, и исходный код этой строки.Кликните на строку исходного кода (выделена тёмно-серым цветом), и вы увидите несколько строк до и после строки, вызвавшей ошибку.Нажмите на “Local vars” под любым фреймом в стеке – и вы увидите таблицу всех локальных переменных и их значения в том месте, где было вызвано исключение.
  • Обратите внимание на ссылку “Switch to copy-and-paste view” под заголовком Traceback. Нажмите на неё, и трассировка переключится на альтернативное отображение, в котором вы легко можете скопировать или вставить текст. Воспользуйтесь этой возможностью, когда вы хотите передать данные людям на канале Django IRC или почтовой рассылке.
    Чуть ниже находится кнопка “Share this traceback on a public Web site“, которая позволяет разместить эту часть трасировки в один клик на ресурсе http://www.dpaste.com/, где она будет доступна другим разработчикам.
  • Далее, в блоке “Request information” включена множество дополнительной информации о полученном Web-запросе, котоырй вызвал ошибку: информация о GET и POST, данные о cookie, мета-информация.
    Немного ниже отображается информация “Request information“, в которой выводятся все текущие настройки для Django (мы уже упоминали о ROOT_URLCONF, а другие мы рассмотрим далее в нашей книге).

Страница ошибок 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>In %s hour(s), it will be %s.</body></html>" % (offset, dt)
    return HttpResponse(html)

И напоследок – очевидно, что многое из предоставленной на этой странице информации имеет особое значение, и было бы глупо предоставлять её на обзор всему Интернету, так как плохие дяди могут использовать её для взлома вашего приложения или всего сервера. Поэтому – такая страница отображается только когда ваше Django-приложение находится в дебаг-режиме, который можно отключить в файле settings.py, заменив параметр опции DEBUG с True на False. Но помните, что по умолчанию – любое новое Django приложение работает в таком дебаг-режиме.

Конец первой главы.

Вторая глава

Оглавление