Главная | Архив новостей | Общение | Площадка | Примеры OpenID
Хостинг Django от «Джино»
Оглавление

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

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


Увидели ошибку?
Выделите её мышкой и нажмите
Ctrl-Enter
Обработано:
1049 49 130 71

Версия книги
1.0 2.0
Версия 2.0 в процессе перевода!

Мой луч
Многообразие света

Полезное
Актуальные вакансии, Python работа для python-разработчиков.


Скачать в формате
CHM от 2 сентября

Заказать PDF файл можно через почту, чат, джаббер. Всего 2WMZ. Содержимое точно соответствует содержимому сайта.
Чем чаще заказываете — тем больше перевожу.

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

на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!
R130494980980
Z425285133788
E112528079659
U327380922061

Книга помогла реализовать:
Проект «Мой луч»
АРМ УФМС.


Мой вебсайт стоит666 337,31 руб

© 2008-2009 Ruslan Popov @ gmail.com Powered by Django 1.1 beta 1 SVN-11114
Главная | Архив новостей | Общение | Площадка | Примеры OpenID