Отладчик Werkzeug.

Во 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

Теперь текст можно скопировать. А можно нажать на кнопку "create paste" и traceback будет опубликован в виде GitHub Gist!

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

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

debugger
icon

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

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 :)

Задание.

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

Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →