Отладка приложений
В зависимости от WSGI шлюза/сервера, исключения обрабатываются по-разному. Чаще всего исключения направляются в stderr или лог ошибок, а отображается общее сообщение «Ошибка сервера 500».
Поскольку это не лучшая среда для отладки, Werkzeug предоставляет WSGI-прослойку, которая отображает подробные трассировки, необязательно с интерактивной консолью отладки для выполнения кода в любом кадре.
Внимание
Отладчик позволяет выполнять произвольный код, что представляет собой серьезную угрозу безопасности. Отладчик никогда не должен использоваться на производственных машинах. Мы не можем достаточно подчеркнуть это. Не включайте отладчик в производственной среде.
Примечание
Интерактивный отладчик не работает в средах с виртуализацией, таких как сервер, запускающий несколько процессов. Большинство таких сред являются производственными серверами, где отладчик вообще не должен быть включён.
Включение отладчика
Включите отладчик, обернув приложение прослойкой DebuggedApplication. В качестве альтернативы, вы можете передать use_debugger=True в run_simple() и она сделает это за вас.
-
class werkzeug.debug.DebuggedApplication(app, evalex=False, request_key='werkzeug.request', console_path='/console', console_init_func=None, show_hidden_frames=False, pin_security=True, pin_logging=True) -
Включает поддержку отладки для данного приложения:
from werkzeug.debug import DebuggedApplication from myapp import app app = DebuggedApplication(app, evalex=True)
Аргумент
evalexпозволяет вычислять выражения в любом кадре трассировки. Это работает путем сохранения каждого кадра с его локальным состоянием. Некоторые состояния, такие как глобальные переменные контекста, по умолчанию не могут быть восстановлены с помощью кадра. При включённомevalex,environ["werkzeug.debug.preserve_context"]будет вызываемым объектом, который принимает менеджер контекста и может быть вызван несколько раз. Каждый менеджер контекста будет входить перед выполнением кода в кадре, а затем снова выходить, чтобы они могли выполнять настройку и завершение для каждого вызова.- Параметры:
-
- app (WSGIApplication) – WSGI-приложение для отладки.
- evalex (bool) – включить функцию оценки исключений (интерактивная отладка). Это требует сервер без форкинга.
- request_key (str) – ключ, указывающий на объект запроса в данной среде. Этот параметр игнорируется в текущих версиях.
- console_path (str) – URL для консоли общего назначения.
- console_init_func (t.Callable[[], dict[str, t.Any]] | None) – функция, которая выполняется перед запуском консоли общего назначения. Возвращаемое значение используется в качестве начального пространства имен.
-
show_hidden_frames (bool) – по умолчанию скрытые кадры трассировки пропускаются. Можно отобразить их, установив этот параметр в
True. - pin_security (bool) – можно использовать для отключения системы безопасности, основанной на пине.
- pin_logging (bool) – включает ведение журнала системы пин.
Журнал изменений
Изменено в версии 2.2: Добавлен ключ окружения
werkzeug.debug.preserve_context.
Использование отладчика
После включения и возникновения ошибки во время запроса, вы увидите подробную трассировку вместо общего сообщения «внутренняя ошибка сервера». Трассировка по-прежнему выводится в терминал.
Сообщение об ошибке отображается в верхней части. Щелчок по нему переместит вас в конец трассировки. Кадры, представляющие код пользователя, в отличие от встроенных или установленных пакетов, выделены синим цветом. Нажатие на кадр отобразит дополнительные строки контекста; повторное нажатие скроет их.
Если функция evalex включена, для каждого кадра трассировки можно получить консоль, наведите курсор на кадр и нажмите значок консоли, который появится справа. После нажатия откроется консоль, где вы сможете выполнить код Python в:
В интерактивных консолях вы можете выполнять любой код Python. В отличие от обычных консолей Python, вывод repr-объектов по умолчанию окрашен и сжат до разумного размера. Если вывод длиннее, чем решает отобразить консоль, к repr добавляется небольшой знак «плюс»; нажатие расширит repr.
Чтобы отобразить все переменные, определенные в текущем кадре, используйте функцию dump(). Вы можете вызвать ее без аргументов, чтобы получить подробный список всех переменных и их значений, или с объектом в качестве аргумента, чтобы получить подробный список всех имеющихся у него атрибутов.
PIN отладчика
Начиная с Werkzeug 0.11, консоль отладки защищена PIN-кодом. Это вспомогательная мера безопасности, чтобы уменьшить вероятность того, что отладчик будет эксплуатироваться, если вы забудете отключить его при развертывании в производственной среде. Проверка PIN по умолчанию включена.
В первый раз при открытии консоли появится диалоговое окно, запросив PIN-код, который выводится в командной строке. PIN генерируется стабильным способом, специфичным для проекта. Явный PIN можно указать через переменную окружения WERKZEUG_DEBUG_PIN. Она может быть установлена в числовое значение, которое станет PIN-кодом. Эта переменная также может быть установлена в значение off для полного отключения проверки PIN.
Если неверный PIN вводится слишком много раз, сервер необходимо перезапустить.
Эта функция не предназначена для полной защиты отладчика. Она предназначена для того, чтобы затруднить злоумышленнику эксплуатацию отладчика. Никогда не включайте отладчик в производственной среде.
Вставка ошибок
Если вы нажмёте на заголовок «Traceback (последний вызов)», вид изменится на традиционную текстовую трассировку. Вы можете скопировать и вставить её, чтобы предоставить информацию при задавании вопроса или сообщении об ошибке.
© 2007–2022 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/2.3.x/debug/