Как отлаживать в Django, хороший способ?

Итак, я начал изучать код Python и позже Django. В первый раз было трудно смотреть на трассировки и фактически выяснить, что я сделал не так, и где была синтаксическая ошибка. Некоторое время прошло и в пути, похоже, у меня есть рутина в отладке моего кода Django. Поскольку это было сделано в начале моего опыта кодирования, я сел и задавался вопросом, как я делаю это, было неэффективно и могло быть сделано быстрее. Обычно мне удается найти и исправить ошибки в моем коде, но мне интересно, нужно ли делать это быстрее?

Я обычно использую информацию об отладке, когда Django дает, когда включен. Когда все заканчивается, как я думал, это будет, я сильно разбиваю поток кода с синтаксической ошибкой и смотрю на переменные в этой точке потока, чтобы выяснить, где код делает что-то отличное от того, что я хотел.

Но можно ли это улучшить? Есть ли хорошие инструменты или лучшие способы отладки вашего кода Django?

Ответ 1

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

import pdb; pdb.set_trace()

или

breakpoint()  #from Python3.7

Если вы попытаетесь загрузить эту страницу в своем браузере, браузер будет зависать, и вы получите приглашение продолжить отладку при фактическом выполнении кода.

Однако есть и другие варианты (я их не рекомендую):

* return HttpResponse({variable to inspect})

* print {variable to inspect}

* raise Exception({variable to inspect})

Но отладчик Python (pdb) настоятельно рекомендуется для всех типов кода Python. Если вы уже знакомы с pdb, вам также стоит взглянуть на IPDB, который использует ipython для отладки.

Еще одно полезное расширение для pdb:

pdb++, предложено Анташем.

pudb, предложено PatDuJour.

Использование отладчика Python в Django, предложенного Seafangs.

Ответ 2

Мне действительно нравится Werkzeug интерактивный отладчик. Он похож на страницу отладки Django, за исключением того, что вы получаете интерактивную оболочку на каждом уровне трассировки. Если вы используете django-extensions, вы получаете команду управления runserver_plus, которая запускает сервер разработки и предоставляет отладчик Werkzeug для исключений.

Конечно, вы должны запускать только локально, так как он дает любому, у кого есть браузер, права на выполнение произвольного кода на языке Python в контексте сервера.

Ответ 3

Немного quickie для тегов шаблонов:

@register.filter 
def pdb(element):
    import pdb; pdb.set_trace()
    return element

Теперь внутри шаблона вы можете сделать {{ template_var|pdb }} и ввести сеанс pdb (если вы используете локальный сервер разработки), где вы можете проверить element на ваш сердечный контент.

Это очень хороший способ узнать, что произошло с вашим объектом, когда он приходит к шаблону.

Ответ 4

Есть несколько инструментов, которые хорошо взаимодействуют и могут облегчить задачу отладки.

Самое главное - панель инструментов отладки Django.

Затем вам нужен хороший журнал, используя средство Python logging. Вы можете отправить вывод журнала в файл журнала, но более простой вариант отправляет вывод журнала в firepython. Чтобы использовать это, вам необходимо использовать браузер Firefox с расширением firebug. Firepython включает плагин firebug, который будет отображать любой серверный журнал на вкладке Firebug.

Firebug сам по себе также имеет решающее значение для отладки стороны Javascript любого приложения, которое вы разрабатываете. (Предположим, что у вас есть код JS, конечно).

Мне также понравился django-viewtools для интерактивного использования отладочных представлений с помощью pdb, но я не так сильно его использую.

Есть более полезные инструменты, такие как dozer для отслеживания утечек памяти (есть и другие полезные рекомендации, приведенные в ответах здесь, на SO для отслеживания памяти).

Ответ 5

Я использую PyCharm (такой же двигатель pydev, что и eclipse). На самом деле помогает мне визуально быть в состоянии выполнить мой код и посмотреть, что происходит.

Ответ 6

Почти все упоминалось до сих пор, поэтому я добавлю, что вместо pdb.set_trace() можно использовать ipdb.set_trace(), который использует iPython и, следовательно, более мощный (автозаполнение и другие лакомства). Для этого требуется пакет ipdb, поэтому вам нужно только pip install ipdb

Ответ 7

Я нажал django-pdb на PyPI. Это простое приложение, которое означает, что вам не нужно редактировать исходный код каждый раз, когда вы хотите перерасти в pdb.

Установка просто...

  • pip install django-pdb
  • Добавьте 'django_pdb' в свой INSTALLED_APPS

Теперь вы можете запустить: manage.py runserver --pdb, чтобы разбить pdb в начале каждого представления...

bash: manage.py runserver --pdb
Validating models...

0 errors found
Django version 1.3, using settings 'testproject.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

GET /
function "myview" in testapp/views.py:6
args: ()
kwargs: {}

> /Users/tom/github/django-pdb/testproject/testapp/views.py(7)myview()
-> a = 1
(Pdb)

И запустите: manage.py test --pdb, чтобы прорваться в pdb при ошибках/ошибках теста...

bash: manage.py test testapp --pdb
Creating test database for alias 'default'...
E
======================================================================
>>> test_error (testapp.tests.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File ".../django-pdb/testproject/testapp/tests.py", line 16, in test_error
    one_plus_one = four
NameError: global name 'four' is not defined
======================================================================

> /Users/tom/github/django-pdb/testproject/testapp/tests.py(16)test_error()
-> one_plus_one = four
(Pdb)

Проект размещен на GitHub, вклады, конечно же, приветствуются.

Ответ 8

Самый простой способ отладки python - особенно для программистов, которые используются для Visual Studio - использует PTVS (Python Tools для Visual Studio). Шаги просты:

  • Загрузите и установите его из http://pytools.codeplex.com/
  • Установите точки останова и нажмите F5.
  • Ваша точка останова попала, вы можете просматривать/изменять переменные так же просто, как отладка программ на С#/С++.
  • Что все:)

Если вы хотите отлаживать Django с помощью PTVS, вам необходимо сделать следующее:

  • В разделе "Настройки проекта" - вкладка "Общие" установите "Загрузочный файл" на "manage.py", точку входа в программу Django.
  • В настройках проекта - вкладка "Отладка", установите "Script" Аргументы "на" runningerver --noreload ". Ключевым моментом здесь является" -noreload". Если вы его не установили, ваши точки останова не пострадают.
  • Наслаждайтесь этим.

Ответ 9

Я использую pyDev, и Eclipse действительно хорош, задает точки останова, вступает в код, просматривает значения для любых объектов и переменных,.

Ответ 10

Я использую PyCharm и поддерживаю его полностью. Мне это стоило немного, но я должен сказать, что преимущество, которое я получаю, бесценно. Я попробовал отладку с консоли, и я даю людям много кредитов, которые могут это сделать, но для меня возможность визуально отлаживать приложения (приложения) отлично.

Я должен сказать, что PyCharm действительно занимает много памяти. Но опять же, ничего хорошего в жизни не бывает. Они просто пришли со своей последней версией 3. Он также отлично сочетается с Django, Flask и Google AppEngine. Итак, в целом, я бы сказал, что это отличный удобный инструмент для любого разработчика.

Если вы еще не используете его, я бы рекомендовал получить пробную версию в течение 30 дней, чтобы взглянуть на мощь PyCharm. Я уверен, что есть и другие инструменты, такие как Aptana. Но я думаю, мне тоже нравится, как выглядит PyCharm. Я чувствую себя очень комфортно, отлаживая свои приложения там.

Ответ 11

Иногда, когда я пытаюсь исследовать в определенном методе, и вызов pdb слишком громоздкий, я бы добавил:

import IPython; IPython.embed()

IPython.embed() запускает оболочку IPython, которая имеет доступ к локальным переменным с того места, где вы его вызываете.

Ответ 12

С моей точки зрения, мы могли бы разбить общие задачи отладки кода на три разных шаблона использования:

  • Что-то имеет вызвало исключение: runserver_plus 'Отладчик Werkzeug для спасения. Возможность запуска пользовательского кода на всех уровнях трассировки является убийцей. И если вы полностью застряли, вы можете создать Gist, чтобы поделиться им одним щелчком.
  • Страница отображается, но результат неверен: снова, Werkzeug rocks. Чтобы создать контрольную точку в коде, просто введите assert False в том месте, где вы хотите остановиться.
  • Код работает неправильно, но быстрый взгляд не помогает. Скорее всего, алгоритмическая проблема. Вздох. Затем я обычно запускаю консольный отладчик PuDB: import pudb; pudb.set_trace(). Основным преимуществом над [i] pdb является то, что PuDB (при просмотре, как вы в 80-х) делает настройку пользовательских выражений часов ветерок. И отладка пучка вложенных циклов намного проще с графическим интерфейсом.

А, да, проблемы с шаблонами. Самая распространенная проблема (для меня и моих коллег) - неправильный контекст: либо у вас нет переменной, либо у вашей переменной нет атрибута. Если вы используете панель инструментов отладки, просто просмотрите контекст в разделе "Шаблоны" или, если этого недостаточно, установите перерыв в кодах ваших просмотров сразу после ваш контекст заполнен.

Так оно и есть.

Ответ 13

Я очень рекомендую epdb (Extended Python Debugger).

https://bitbucket.org/dugan/epdb

Одна вещь, которую мне нравится в epdb для отладки Django или других веб-серверов Python, - это команда epdb.serve(). Это устанавливает трассировку и служит для этого на локальном порту, к которому вы можете подключиться. Типичный вариант использования:

У меня есть представление, что я хочу пройти шаг за шагом. Я буду вставлять следующее в точке, где я хочу установить трассировку.

import epdb; epdb.serve()

После выполнения этого кода я открываю интерпретатор Python и подключаюсь к экземпляру службы. Я могу проанализировать все значения и выполнить код с помощью стандартных команд pdb, таких как n, s и т.д.

In [2]: import epdb; epdb.connect()
(Epdb) request
<WSGIRequest
path:/foo,
GET:<QueryDict: {}>, 
POST:<QuestDict: {}>,
...
>
(Epdb) request.session.session_key
'i31kq7lljj3up5v7hbw9cff0rga2vlq5'
(Epdb) list
 85         raise some_error.CustomError()
 86 
 87     # Example login view
 88     def login(request, username, password):
 89         import epdb; epdb.serve()
 90  ->     return my_login_method(username, password)
 91
 92     # Example view to show session key
 93     def get_session_key(request):
 94         return request.session.session_key
 95

И еще больше, что вы можете узнать о вводе справки epdb в любое время.

Если вы хотите одновременно использовать или подключаться к нескольким экземплярам epdb, вы можете указать порт для прослушивания (по умолчанию 8080). То есть.

import epdb; epdb.serve(4242)

>> import epdb; epdb.connect(host='192.168.3.2', port=4242)

Значение по умолчанию для хоста - "localhost", если не указано. Я бросил его здесь, чтобы продемонстрировать, как вы можете использовать это для отладки чего-то другого, кроме локального экземпляра, например сервера разработки в локальной локальной сети. Очевидно, что если вы сделаете это, будьте осторожны, чтобы установленная трассировка никогда не попадала на ваш производственный сервер!

Как бы то ни было, вы все равно можете сделать то же самое, что и принятый ответ с помощью epdb (import epdb; epdb.set_trace()), но я хотел бы выделить функциональность сервиса, так как я нашел его таким полезным.

Ответ 14

Я только что нашел wdb (http://www.rkblog.rk.edu.pl/w/p/debugging-python-code-browser-wdb-debugger/?goback=%2Egde_25827_member_255996401). У этого есть довольно приятный пользовательский интерфейс/графический интерфейс со всеми звонками и свистами. Автор говорит об этом wdb -

"Есть IDE, такие как PyCharm, у которых есть свои собственные отладчики. Они предлагают одинаковый или равный набор функций... Однако для их использования вы должны использовать те специфические IDE (а некоторые из них являются несвободными или не могут быть доступный для всех платформ). Выберите подходящий инструмент для ваших нужд.

Думаю, я просто передал бы это.

Также очень полезная статья о отладчиках python: https://zapier.com/engineering/debugging-python-boss/

Наконец, если вы хотите увидеть красивую графическую распечатку своего стека вызовов в Django, checkout: https://github.com/joerick/pyinstrument. Просто добавьте pyinstrument.middleware.ProfilerMiddleware в MIDDLEWARE_CLASSES, а затем добавьте? Profile в конец URL-адреса запроса, чтобы активировать профайлер.

Можно также запустить pyinstrument из командной строки или импортировать в качестве модуля.

Ответ 15

Я использую PyCharm и различные инструменты отладки. Также у вас есть хорошие статьи о том, как легко настроить эти вещи для новичков. Вы можете начать здесь. В нем рассказывается об отладке PDB и GUI в целом с проектами Django. Надеюсь, кто-то выиграет от них.

Ответ 16

Один из лучших вариантов для отладки кода Django - через wdb: https://github.com/Kozea/wdb

wdb работает с python 2 (2.6, 2.7), python 3 (3.2, 3.3, 3.4, 3.5) и pypy. Еще лучше, можно отлаживать программу python 2 с сервером wdb, работающим на python 3, и наоборот или отлаживать программу, запущенную на компьютере с сервером отладки, запущенным на другом компьютере внутри веб-страницы на третьем компьютере! Еще лучше, теперь можно приостановить текущий выполняемый процесс/поток python, используя инъекцию кода из веб-интерфейса. (Для этого требуются gdb и ptrace) Другими словами, это очень улучшенная версия pdb прямо в вашем браузере с приятными функциями.

Установите и запустите сервер, а в коде добавьте:

import wdb
wdb.set_trace()

Согласно автору, основными отличиями от pdb являются:

Для тех, кто не знает проект, wdb - отладчик python, такой как pdb, но с интерфейсом с гладким веб-интерфейсом и множеством дополнительных функций, таких как:

  • Выделение синтаксиса источника
  • Визуальные точки останова
  • Интерактивное завершение кода с использованием jedi
  • Постоянная точка останова
  • Проверка объектов с помощью мыши Поддержка многопоточности/многопроцессорности
  • Удаленная отладка
  • Смотреть выражения
  • В редакции кода отладчика
  • Интеграция популярных веб-серверов для устранения ошибки
  • При исключении исключения во время трассировки (не посмертного) в отличие от отладчика werkzeug, например
  • Нарушение текущих запущенных программ с помощью ввода кода (в поддерживаемых системах)

Он имеет отличный пользовательский интерфейс на основе браузера. Радость в использовании!:)

Ответ 17

Добавьте import pdb; pdb.set_trace() или breakpoint() (форма python3.7) в соответствующую строку в коде Python и выполните его. Выполнение остановится с помощью интерактивной оболочки. В оболочке вы можете выполнить код Python (например, переменные печати) или использовать такие команды, как:

  • c продолжить исполнение
  • n перейти к следующей строке в той же функции
  • s перейти к следующей строке в этой функции или вызываемой функции
  • q выйти из отладчика/выполнения

Также см: https://poweruser.blog/setting-a-breakpoint-in-python-438e23fe6b28

Ответ 18

Если вы используете Aptana для разработки django, смотрите это: http://www.youtube.com/watch?v=qQh-UQFltJQ

Если нет, подумайте над его использованием.

Ответ 19

Большинство вариантов упоминаются как alredy. Чтобы распечатать контекст шаблона, я создал для него простую библиотеку. См. https://github.com/edoburu/django-debugtools

Вы можете использовать его для печати контекста шаблона без какой-либо конструкции {% load %}:

{% print var %}   prints variable
{% print %}       prints all

Он использует настраиваемый формат pprint для отображения переменных в теге <pre>.

Ответ 20

Мне нравятся ответы, которые я могу скопировать напрямую. И мне нравится IPython:

pip install ipdb

В вашем коде:

import ipdb; ipdb.set_trace()

Ответ 21

Я нахожу, что Visual Studio Code отлично подходит для отладки приложений Django. Стандартные параметры запуска python launch.json запускают python manage.py с прикрепленным отладчиком, поэтому вы можете установить точки останова и выполнить свой код по своему усмотрению.

Ответ 22

Для тех, кто может случайно добавить pdb в живые коммиты, я могу предложить это расширение ответа # Koobz:

@register.filter 
def pdb(element):
    from django.conf import settings
    if settings.DEBUG:    
        import pdb
        pdb.set_trace()
    return element

Ответ 23

Я настоятельно рекомендую использовать PDB.

import pdb
pdb.set_trace()

Вы можете проверить все значения переменных, перейти к функции и многое другое. https://docs.python.org/2/library/pdb.html

для проверки всех видов запросов, ответов и обращений к базе данных. Я использую django-debug-toolbar https://github.com/django-debug-toolbar/django-debug-toolbar

Ответ 24

Как упоминалось в других сообщениях здесь - установка контрольных точек в вашем коде и прохождение через код, чтобы увидеть, ведет ли он себя так, как вы ожидали, - это отличный способ узнать что-то вроде Django, пока у вас не будет хорошее представление о том, как все это ведет - и что делает ваш код.

Для этого я бы рекомендовал использовать WingIde. Так же, как и другие упомянутые IDE, приятные и простые в использовании, приятные макеты, а также легко установить контрольные точки для оценки/изменения стека и т.д. Идеально подходит для визуализации того, что делает ваш код при его прохождении. Я большой поклонник этого.

Также я использую PyCharm - он обладает отличным анализом статического кода и может помочь иногда выявлять проблемы, прежде чем вы поймете, что они есть.

Как уже упоминалось, необходима панель инструментов django-debug - https://github.com/django-debug-toolbar/django-debug-toolbar

И хотя явным образом не инструмент отладки или анализа - один из моих избранных SQL Printing Middleware доступен из Django Snippets по адресу https://djangosnippets.org/snippets/290/

Здесь будут отображаться SQL-запросы, сгенерированные вашим представлением. Это даст вам хорошее представление о том, что делает ORM, и если ваши запросы эффективны или вам нужно переработать код (или добавить кеширование).

Я считаю его неоценимым для того, чтобы следить за эффективностью запросов при разработке и отладке моего приложения.

Только один совет - я немного изменил его для собственного использования, чтобы показать только сводку, а не инструкцию SQL... Поэтому я всегда использую ее при разработке и тестировании. Я также добавил, что если len (connection.queries) больше заданного порога, он отображает дополнительное предупреждение.

Затем, если я вижу что-то плохое (с точки зрения производительности или количества запросов), я возвращаюсь к полному отображению операторов SQL, чтобы точно видеть, что происходит. Очень удобно, когда вы работаете над большим проектом Django с несколькими разработчиками.

Ответ 25

используйте pdb или ipdb. Разница между этими двумя - ipdb поддерживает автоматическое завершение.

для pdb

import pdb
pdb.set_trace()

для ipdb

import ipdb
ipdb.set_trace()

Для выполнения новой строки нажмите клавишу n, для продолжения нажмите клавишу c. проверьте дополнительные параметры, используя help(pdb)

Ответ 26

Исходя из собственного опыта, есть два пути:

  1. используйте ipdb, который является расширенным отладчиком, любит pdb.

    import ipdb;ipdb.set_trace() или breakpoint() (из python3.7)

  2. используйте оболочку django, просто используйте команду ниже. Это очень полезно при разработке нового представления.

    python manage.py shell

Ответ 27

Дополнительное предложение.

Вы можете использовать nosetests и pdb вместе, вместо того, чтобы вставлять pdb.set_trace() в свои представления вручную. Преимущество состоит в том, что вы можете наблюдать за ошибками при первом запуске, возможно, в стороннем коде.

Вот ошибка для меня сегодня.

TypeError at /db/hcm91dmo/catalog/records/

render_option() argument after * must be a sequence, not int

....


Error during template rendering

In template /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/crispy_forms/templates/bootstrap3/field.html, error at line 28
render_option() argument after * must be a sequence, not int
18  
19          {% if field|is_checkboxselectmultiple %}
20              {% include 'bootstrap3/layout/checkboxselectmultiple.html' %}
21          {% endif %}
22  
23          {% if field|is_radioselect %}
24              {% include 'bootstrap3/layout/radioselect.html' %}
25          {% endif %}
26  
27          {% if not field|is_checkboxselectmultiple and not field|is_radioselect %}
28  

      {% if field|is_checkbox and form_show_labels %}

Теперь я знаю, что это означает, что я искал конструктор для формы, и у меня даже есть хорошее представление о том, какое поле является проблемой. Но могу ли я использовать pdb, чтобы узнать, что жалкие формы жалуются, в шаблоне?

Да, могу. Использование опции -pdb для nosetests:

tests$ nosetests test_urls_catalog.py --pdb

Как только я удалю любое исключение (включая обработанные изящно), pdb останавливается там, где это происходит, и я могу посмотреть вокруг.

  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py", line 537, in __str__
    return self.as_widget()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py", line 593, in as_widget
    return force_text(widget.render(name, self.value(), attrs=attrs))
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py", line 513, in render
    options = self.render_options(choices, [value])
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py", line 543, in render_options
    output.append(self.render_option(selected_choices, *option))
TypeError: render_option() argument after * must be a sequence, not int
INFO lib.capture_middleware log write_to_index(http://localhost:8082/db/hcm91dmo/catalog/records.html)
INFO lib.capture_middleware log write_to_index:end
> /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py(543)render_options()
-> output.append(self.render_option(selected_choices, *option))
(Pdb) import pprint
(Pdb) pprint.PrettyPrinter(indent=4).pprint(self)
<django.forms.widgets.Select object at 0x115fe7d10>
(Pdb) pprint.PrettyPrinter(indent=4).pprint(vars(self))
{   'attrs': {   'class': 'select form-control'},
    'choices': [[('_', 'any type'), (7, (7, 'type 7', 'RECTYPE_TABLE'))]],
    'is_required': False}
(Pdb)         

Теперь ясно, что мой аргумент выбора для конструктора хрустящего поля был таким, какой он был в списке в списке, а не в списке/кортеже кортежей.

 'choices': [[('_', 'any type'), (7, (7, 'type 7', 'RECTYPE_TABLE'))]]

Оптимальная вещь заключается в том, что этот pdb происходит внутри хрустящего кода, а не моего, и мне не нужно вставлять его вручную.

Ответ 28

Во время разработки добавление быстрого

assert False, value

может помочь диагностировать проблемы во взглядах или где-либо еще, без необходимости использовать отладчик.