Поиск…


замечания

PDB

Pdb также может распечатывать все существующие переменные в глобальной или локальной области, путем ввода globals() или locals() в (Pdb) соответственно.

Использование Python Debugger (Pdb)

Основным инструментом отладки Django является pdb , часть стандартной библиотеки Python.

Скрипт сценария Init

Рассмотрим простой скрипт views.py :

from django.http import HttpResponse


def index(request):
    foo = 1
    bar = 0

    bug = foo/bar

    return HttpResponse("%d goes here." % bug)

Команда консоли для запуска сервера:

python manage.py runserver

Очевидно, что Django бросает ZeroDivisionError при попытке загрузить индексную страницу, но если мы притворимся, что ошибка очень глубока в коде, это может стать действительно неприятным.

Установка точки останова

К счастью, мы можем установить точку останова для отслеживания этой ошибки:

from django.http import HttpResponse

# Pdb import
import pdb


def index(request):
    foo = 1
    bar = 0
    
    # This is our new breakpoint
    pdb.set_trace()
    
    bug = foo/bar
    
    return HttpResponse("%d goes here." % bug)

Команда консоли для запуска сервера с pdb:

python -m pdb manage.py runserver

Теперь в точке останова на странице будет вызываться запрос (Pdb) в оболочке, который также повредит ваш браузер в ожидающем состоянии.

Отладка с оболочкой pdb

Пришло время отладить это представление, взаимодействуя со скриптом через оболочку:

> ../views.py(12)index()
-> bug = foo/bar
# input 'foo/bar' expression to see division results:
(Pdb) foo/bar
*** ZeroDivisionError: division by zero
# input variables names to check their values:
(Pdb) foo
1
(Pdb) bar
0
# 'bar' is a source of the problem, so if we set it's value > 0...
(Pdb) bar = 1
(Pdb) foo/bar
1.0
# exception gone, ask pdb to continue execution by typing 'c':
(Pdb) c
[03/Aug/2016 10:50:45] "GET / HTTP/1.1" 200 111

В последней строке мы видим, что наше представление вернуло ответ OK и выполнило его как следует.

Чтобы остановить цикл pdb, просто введите q в оболочку.

Использование панели инструментов Django Debug

Во-первых, вам нужно установить панель инструментов django-debug :

pip install django-debug-toolbar

settings.py :

Затем включите его в установленные приложения проекта, но будьте осторожны - всегда полезно использовать другой файл settings.py для таких приложений только для разработки, а middlewares - как панель отладки:

# If environment is dev...
DEBUG = True

INSTALLED_APPS += [
    'debug_toolbar',
]

MIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware']

Панель инструментов Debug также использует статические файлы, поэтому соответствующее приложение также должно быть включено:

INSTALLED_APPS = [
    # ...
    'django.contrib.staticfiles',
    # ...
]

STATIC_URL = '/static/'

# If environment is dev...
DEBUG = True

INSTALLED_APPS += [
    'debug_toolbar',
]

В некоторых случаях также необходимо установить INTERNAL_IPS в settings.py :

INTERNAL_IPS = ('127.0.0.1', )

urls.py :

В urls.py , как предполагает официальная документация, следующий фрагмент должен включать маршрутизацию панели отладки:

if settings.DEBUG and 'debug_toolbar' in settings.INSTALLED_APPS:
    import debug_toolbar
    urlpatterns += [
        url(r'^__debug__/', include(debug_toolbar.urls)),
    ]

Соберите статическую панель после установки:

python manage.py collectstatic

Вот так, панель инструментов debug появится на ваших страницах проекта, предоставив разнообразную полезную информацию о времени выполнения, SQL, статических файлах, сигналах и т. Д.

HTML:

Кроме того, для django-debug-toolbar требуется, чтобы теги Content-type text/html , <html> и <body> отображались правильно.


Если вы уверены, что настроили все правильно, но панель инструментов отладки все еще не отображается: используйте это «ядерное» решение, чтобы попытаться понять это.

Использование "assert False"

При разработке, вставляя следующую строку в свой код:

assert False, value

приведет к тому, что django поднимет AssertionError со значением, предоставленным как сообщение об ошибке, когда эта строка будет выполнена.

Если это происходит в представлении или в любом коде, вызванном из представления, и установлено значение DEBUG=True , в браузере будет отображаться полная и подробная таблица с большой информацией об отладке.

Не забудьте удалить линию, когда вы закончите!

Рассмотрите возможность написания дополнительной документации, тестов, протоколирования и утверждений вместо использования отладчика

Отладка требует времени и усилий.

Вместо того, чтобы преследовать ошибки с помощью отладчика, подумайте о том, чтобы потратить больше времени на улучшение кода:

  • Записывайте и запускайте тесты . У Python и Django есть отличные встроенные рамки тестирования, которые могут быть использованы для проверки вашего кода намного быстрее, чем вручную с помощью отладчика.
  • Написание надлежащей документации для ваших функций, классов и модулей. PEP 257 и Руководство по стилю Python от Google предоставляют хорошие рекомендации для написания хороших докстерий.
  • Используйте Logging для вывода результатов из вашей программы - во время разработки и после развертывания.
  • Добавьте assert ионы в свой код в важных местах: уменьшите двусмысленность, поймите проблемы по мере их создания.

Бонус: Напишите доктрины для объединения документации и тестирования!



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow