Как отладить в Django, хороший способ? [закрытый]

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

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

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

27 ответов


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

import pdb; pdb.set_trace()

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

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

* 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.


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

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


немного по-быстрому для шаблонов тегов:

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

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

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


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

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

тогда вам нужно хорошее ведение журнала с помощью Python лесозаготовки объект. Вы можете отправить вывод журнала в файл журнала, но более простой вариант-отправить вывод журнала в firepython. Чтобы использовать это, вам нужно использовать браузер Firefox с firebug


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


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


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

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

  1. pip install django-pdb
  2. добавить '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, взносы приветствуются, конечно.


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

  1. Загрузите и установите его из http://pytools.codeplex.com/
  2. установите точки останова и нажмите F5.
  3. ваша точка останова поражена, вы можете просматривать/изменять переменные так же легко, как отладка программ C#/C++.
  4. вот и все :)

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

  1. в настройках проекта - вкладка "Общие" установите "файл запуска" в "manage.py", точка входа в программу Django.
  2. на вкладке Параметры проекта-отладка установите " Аргументы скрипта "в"runserver --noreload". Ключевым моментом здесь является "-- noreload". Если вы не установите его, точки останова не попал.
  3. понравится.

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


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

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

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


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

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

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

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


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

import IPython; IPython.embed()

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


я настоятельно рекомендую epdb (расширенный отладчик Python).

https://bitbucket.org/dugan/epdb

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

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

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()) но я хотел выделить функциональность подачи с Я нахожу это очень полезным.


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

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

думал, что просто передам.

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

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

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


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


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

Если нет, рассмотрите возможность его использования.


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

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

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

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


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


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

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

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

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

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

import wdb
wdb.set_trace()

по мнению автора, основные отличия по отношению к pdb являются:

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

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

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


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

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

Смотрите также: https://poweruser.блог/настройка--точка останова-в-питон-438e23fe6b28


Я настоятельно рекомендую использовать 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


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

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

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

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

и хотя явно не инструмент отладки или анализа-один из моих любимых -промежуточное по печати SQL доступные из фрагментов Django в https://djangosnippets.org/snippets/290/

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

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

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

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


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

можно использовать 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 %}

теперь я знаю, что это означает, что я goofed конструктор для формы, и у меня даже есть хорошее представление о том, какое поле является проблемой. Но, может Я использую 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 для конструктора crispy field был как список в списке, а не список / кортеж кортежей.

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

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


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

для pdb

import pdb
pdb.set_trace()

для ipdb все

import ipdb
ipdb.set_trace()

для выполнения новой линии нажмите n ключ, для продолжения нажмите c ключ. Проверьте дополнительные параметры с помощью help(pdb)


во время разработки, добавив быстрый

assert False, value

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


из моего собственного опыта, есть два способа:

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

    import ipdb;ipdb.set_trace()

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

    python manage.py shell