Django
отладка
Поиск…
замечания
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
ионы в свой код в важных местах: уменьшите двусмысленность, поймите проблемы по мере их создания.
Бонус: Напишите доктрины для объединения документации и тестирования!