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