Отладка приложений
В зависимости от шлюза/сервера 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-коде.
- pin_logging (bool) – включает ведение журнала системы PIN.
Журнал изменений
Изменено в версии 2.2: Добавлен ключ
werkzeug.debug.preserve_contextсреды.
Использование отладчика
После включения и возникновения ошибки во время запроса вы увидите подробную трассировку стека вместо общего сообщения «внутренняя ошибка сервера». Трассировка стека по-прежнему выводится в терминал.
Сообщение об ошибке отображается вверху. Щелчок по нему переходит к низу трассировки стека. Кадры, представляющие пользовательский код, в отличие от встроенных или установленных пакетов, выделены синим цветом. Щелчок по кадру отобразит больше строк контекста, повторный щелчок скроет их.
Если у вас включена функция evalex, вы можете получить консоль для каждого кадра в трассировке стека, наведите курсор на кадр и щелкните значок консоли, который появляется справа. После щелчка откроется консоль, где вы можете выполнить код Python в:
Внутри интерактивных консолей вы можете выполнять любой тип кода Python. В отличие от обычных консолей Python, вывод объектов repr отображается в цвете и усечен до разумного размера по умолчанию. Если вывод длиннее, чем консоль решает отобразить, к repr добавляется маленький значок плюса, и щелчок позволит его расширить.
Чтобы отобразить все переменные, определенные в текущем кадре, вы можете использовать функцию dump(). Вы можете вызвать ее без аргументов, чтобы получить подробный список всех переменных и их значений, или с объектом в качестве аргумента, чтобы получить подробный список всех его атрибутов.
PIN-код отладчика
Консоль отладки защищена PIN-кодом. Это вспомогательное средство безопасности, чтобы снизить вероятность эксплуатации отладчика, если вы забудете отключить его при развертывании в рабочей среде. Проверка подлинности, основанная на PIN-коде, включена по умолчанию.
При первом открытии консоли появится диалоговое окно, запрашивающее PIN-код, который выводится в командной строке. PIN-код генерируется стабильным способом, специфичным для проекта. Явный PIN-код можно предоставить через переменную среды WERKZEUG_DEBUG_PIN. Это можно установить в числовое значение, которое станет PIN-кодом. Эта переменная также может быть установлена в значение off для полного отключения проверки PIN-кода.
Если неправильный PIN-код вводится слишком много раз, необходимо перезапустить сервер.
**Эта функция не предназначена для полной защиты отладчика. Она предназначена для затруднения использования отладчика злоумышленником. Никогда не включайте отладчик в рабочей среде.**
Разрешенные хосты
Консоль отладки будет обслуживаться только в том случае, если запрос поступает от доверенного хоста. Если запрос поступает от страницы браузера, которая не обслуживается по доверенному URL-адресу, будет возвращена ошибка 400.
По умолчанию localhost, любой .localhost домен и 127.0.0.1 являются доверенными. run_simple будет доверять своему аргументу hostname также. Чтобы изменить это дальше, используйте среду отладки напрямую, а не через use_debugger=True.
if os.environ.get("USE_DEBUGGER") in {"1", "true"}:
app = DebuggedApplication(app, evalex=True)
app.trusted_hosts = [...]
run_simple("localhost", 8080, app)
**Эта функция не предназначена для полной защиты отладчика. Она предназначена для затруднения использования отладчика злоумышленником. Никогда не включайте отладчик в рабочей среде.**
Вставка ошибок
Если вы нажмете на заголовок «Трассировка стека (последний вызов)», представление переключится на традиционную текстовую трассировку стека. Вы можете скопировать и вставить ее, чтобы предоставить информацию при задании вопроса или сообщении об ошибке.
© 2007 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/latest/debug/