Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Отладчик Werkzeug Python: Веб-разработка (Flask)

Flask построен на основе очень мощной библиотеки Werkzeug (читается "Веркцойг"). В начале курса я уже рассказывал, как включить во Flask режим отладки (export FLASK_ENV=development). Но тогда я отметил лишь то, что режим отладки более удобно отображает сообщения об ошибках. Так вот, эти страницы формирует именно Werkzeug. Но страницы, которые генерирует Werkzeug, не только выглядят симпатично. Узнаем же, как выжать из Werkzeug максимум пользы!

Просмотр tracebacks

Давайте предположим, что у нашего приложения есть такой обработчик:

@app.route('/div/<int:n1>/<int:n2>/')
def div(n1, n2):
    result = n1 / n2
    return str(result)

Здесь из пути извлекаются два параметра-числа и возвращается результат деления одного на другое. Давайте же поделим на ноль!

traceback example

В таком виде вывод уже достаточно информативен, но для каждой записи можно посмотреть не только текущую строку кода, но и "окрестности". Для этого нужно кликнуть на эту самую строку кода. Вы получите что-то такое:

frame details

Получение и публикация текстового представления traceback

Часто traceback нужно не только посмотреть самостоятельно, но показать кому-то. Но как сохранить именно текущее сообщение об ошибке? Можно переключить вывод в режим "просто текст" — для этого нужно кликнуть на заголовок таблицы (со словом "Traceback"):

text mode

Теперь текст можно скопировать и опубликовать, например на GitHub Gist!

Интерактивный отладчик

Если навести на строку кода в traceback, то справа появится значок терминала. Вот как это выглядит:

debugger icon

Нажав на эту кнопку вы запустите прямо в браузере сеанс отладчика! Но сначала Werkzeug спросит у вас PIN:

PIN window

PIN нужно взять из сообщения, которое выводит в терминал Flask при старте в режиме отладки. Выглядит это сообщение так:

 * Serving Flask app ...
 * Environment: development
 * Debug mode: on
 * Running on http://127.0.0.1:8000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 176-833-918

Этот PIN меняется при каждом запуске сервера, что позволяет вам меньше волноваться о безопасности данных, даже если вы забыли отключить режим отладки на "боевом" сервере.

Если проверка PIN прошла успешно, то вы попадёте в настоящий интерпретатор (REPL):

REPL

В этом REPL вы можете делать всё то, что можете делать в локальном интерпретаторе Python. Более того, область видимости будет соответствовать тому, что было загружено в интерпретатор на момент выполнения той строки кода, для которой вы отладчик вызвали! А это значит, что вы можете посмотреть значение любого параметра запроса — то, что нужно при отладке! Для более удобного вывода всех локальных переменных вам даже предоставляется функция dump() (и её вариант dump(obj), выводящий подробности касательно указанного объекта).

Важно помнить, в консоли Werzeug вы имеете доступ ко всему тому, что доступно интерпретатору, запустившему сервер. Например, вы можете вызывать функции, которые что-то изменяют в базе данных или модифицируют файлы на диске. "Великая сила == великая ответственность", вот это всё. Так что будьте осторожны и не оставляйте режим отладки включенным на выставленных в Internet серверах, ведь даже PIN не даёт абсолютной защиты от достаточно упорных исследователей!

Немного о самом Werkzeug

Не стоит думать о Werkzeug, как о маленькой надстройке над Flask. В реальности как раз Flask является тонким слоем снега на верхушке айсберга Werkzeug. Именно Werkzeug работает с запросами и ответами, производит маршрутизацию, да ещё и делает это всё эффективно. Flask лишь прикручивает сбоку к Werkzeug шаблонизатор (Jinja2, тоже вполне самостоятельный) и предоставляет более удобный синтаксис для описания маршрутов. Поэтому не удивляйтесь тому, что Flask в своей документации постоянно ссылается на документацию к Werkzeug :)

Задание

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


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 130 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
1 июня 10 месяцев

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»