Хостинг Django от «Джино»
Table of contents

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

Восхититесь созданным вами web-приложением, а теперь давайте сломаем его. Умышленно внесём ошибку в код представления hours_ahead, закомментировав строки offset = int(offset):

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)

Запустите тестовый сервер и перейдите по ссылке http://127.0.0.1:8000/time/plus/3/. Вы увидите страницу с ошибкой, которая будет содержать значительный объём информации, включая TypeError сообщение на самом верху:

"unsupported type for timedelta hours component: unicode"

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

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

Отметим следующее:

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

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

    Если кликнуть на строку с исходным кодом, то вы увидите несколько строк выше и ниже данной строки, это даст вам контекст ошибки.

    Кликните на «Local vars» под любым кадром стека для того, чтобы получить таблицу всех локальных переменных и их значения именно в этой точке кода. Эта отладочная информация бывает очень полезна.

  • Обратите внимание на текст «Switch to copy-and-paste view» под заголовком «Traceback». Нажмите на эти слова и трейс переключится в альтернативный вид, который может быть легко скопирован. Используйте эту возможность когда вам необходимо поделиться информацией об ошибке с другими разработчиками для получения технической поддержки — например с людьми с канала djangobook@conference.jabber.ru или в списке рассылки.

    Ниже расположенная кнопка Share this traceback on a public Web site сделает эту работу за вас. Она отправляет информацию об ошибке на сервис http://www.dpaste.com/, вы получаете точный URL с текстом ошибки и можете передавать его другим разработчикам.

  • Секция «Request information» содержит информацию о пришедшем web-запросе, который вызвал ошибку: GET и POST информация, значения cookie и такая мета информация, как CGI заголовки.

    Под секцией «Request information» расположена секция «Settings» со списком всех настроек для данного проекта. (Мы уже упоминали ROOT_URLCONF и мы покажем различные параметры в течение книги.)

Страница с ошибкой имеет возможность отображать ещё больше информации в особых случаях, например, в случаях ошибки в синтаксисе шаблона. Мы рассмотрим это позже, когда будем обсуждать шаблонную систему Django. А сейчас, раскомментируйте строки представления hours_ahead, чтобы она смогла работать правильно.

Вы являетесь разработчиком, которому нравится производить отладку кода с помощью оператора 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 — будет глупо отображать её всему Internet. Какой-нибудь отрицательный персонаж может воспользоваться ей для изучения вашего web-приложения и осуществления своих зловредных планов. По этой причине Django отображает страницу с ошибкой только когда находится в режиме отладки. Мы объясним позже как деактивировать отладочный режим в главе «Сессии, пользователи и регистрация». Просто запомните, что после создания проект находится в режиме отладки.


Ищем Python программистов

Found misprint?
Select it with the mouse and hit Enter
Ctrl-Enter
Processed:
33 1 199 25


The full repository of DjangoBook translation you can get on GitHub.
We appreciate your patches!

We are glad to hear your questions, comments or suggestions!
(Open in new tab)

Users number: 601

Русская группа

на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!
ЯМ:41001223475816


© 2008-2012 Ruslan Popov @ gmail.com Powered by Django 1.2.5