Во Flask построен на основе очень мощной библиотеки Werkzeug (читается "Веркцойг"). В начале курса я уже рассказывал,
как включить во Flask режим отладки (export FLASK_ENV=development
). Но тогда я отметил лишь то, что режим отладки
более удобно отображает сообщения об ошибках. Так вот, эти страницы формирует именно Werkzeug. Но страницы, которые
генерирует Werkzeug, не только выглядят симпатично. Узнаем же, как выжать из Werkzeug максимум пользы!
Давайте предположим, что у нашего приложения есть такой обработчик:
@app.route('/div/<int:n1>/<int:n2>/')
def div(n1, n2):
result = n1 / n2
return str(result)
Здесь из пути извлекаются два параметра-числа и возвращается результат деления одного на другое. Давайте же поделим на ноль!
В таком виде вывод уже достаточно информативен, но для каждой записи можно посмотреть не только текущую строку кода, но и "окрестности". Для этого нужно кликнуть на эту самую строку кода. Вы получите что-то такое:
Часто traceback нужно не только посмотреть самостоятельно, но показать кому-то. Но как сохранить именно текущее сообщение об ошибке? Можно переключить вывод в режим "просто текст" — для этого нужно кликнуть на заголовок таблицы (со словом "Traceback"):
Теперь текст можно скопировать. А можно нажать на кнопку "create paste" и traceback будет опубликован в виде GitHub Gist!
Если навести на строку кода в traceback, то справа появится значок терминала. Вот как это выглядит:
Нажав на эту кнопку вы запустите прямо в браузере сеанс отладчика! Но сначала Werkzeug спросит у вас PI:
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 вы можете делать всё то, что можете делать в локальном интерпретаторе Python. Более того, область видимости
будет соответствовать тому, что было загружено в интерпретатор на момент выполнения той строки кода, для которой вы
отладчик вызвали! А это значит, что вы можете посмотреть значение любого параметра запроса — то, что нужно при
отладке! Для более удобного вывода всех локальных переменных вам даже предоставляется функция dump()
(и её
вариант dump(obj)
, выводящий подробности касательно указанного объекта).
Важно помнить, в консоли Werzeug вы имеете доступ ко всему тому, что доступно интерпретатору, запустившему сервер. Например, вы можете вызывать функции, которые что-то изменяют в базе данных или модифицируют файлы на диске. "Великая сила == великая ответственность", вот это всё. Так что будьте осторожны и не оставляйте режим отладки включенным на выставленных в Internet серверах, ведь даже PIN не даёт абсолютной защиты от достаточно упорных исследователей!
Не стоит думать о Werkzeug, как о маленькой надстройке над Flask. В реальности как раз Flask является тонким слоем снега на верхушке айсберга Werkzeug. Именно Werkzeug работает с запросами и ответами, производит маршрутизацию, да ещё и делает это всё эффективно. Flask лишь прикручивает сбоку к Werkzeug шаблонизатор (Jinja2, тоже вполне самостоятельный) и предоставляет более удобный синтаксис для описания маршрутов. Поэтому не удивляйтесь тому, что Flask в своей документации постоянно ссылается на документацию к Werkzeug :)
Попробуйте вызвать ошибки внутри обработчиков вашего приложения и поисследуйте код изнутри с помощью отладчика.