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

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

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

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

26 Solutions collect form web for “Как отлаживать в Django, хороший способ?”

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

import pdb; pdb.set_trace() 

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

Однако есть другие варианты, предложенные другими (я не буду их рекомендовать):

 * return HttpResponse({variable to inspect}) * print {variable to inspect} * raise Exception({variable to inspect}) 

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

Полезная ссылка Seafangs : использование отладчика Python в Django

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

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

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

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

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

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

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

Наиболее важной является панель инструментов отладки Django .

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

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

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

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

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

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

Я нажал django-pdb на 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 для Visual Studio). Шаги просты:

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

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

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

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

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

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

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

Такие дела.

Я очень рекомендую 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) 

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

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

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

 import IPython; IPython.embed() 

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

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

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

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

Я только что нашел 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, проверьте: https://github.com/joerick/pyinstrument . Просто добавьте pyinstrument.middleware.ProfilerMiddleware в MIDDLEWARE_CLASSES, а затем добавьте? Profile в конец URL-адреса запроса, чтобы активировать профайлер.

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

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

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

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

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

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

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

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

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

 pip install ipdb 

В вашем коде:

 import ipdb; ipdb.set_trace() 

Я настоятельно рекомендую использовать 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. Так же, как и другие упомянутые IDE, приятные и простые в использовании, приятные макеты, а также легко установить контрольные точки для оценки / изменения стека и т. Д. Идеально подходит для визуализации того, что делает ваш код при его прохождении. Я большой поклонник этого.

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

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

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

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

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

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

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

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

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

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

Вы можете использовать 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 для носететов:

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 происходит внутри кода хрустящей корочки, а не моего, и мне не нужно вставлять его вручную.

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

для pdb

 import pdb pdb.set_trace() 

для ipdb

 import ipdb ipdb.set_trace() 

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

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

 assert False, value 

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

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

Один из лучших вариантов отладки кода 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, но с гладким веб-интерфейсом и множеством дополнительных функций, таких как:

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

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

  • Есть ли хорошие варианты для выкидывания сайта Django как статические файлы?
  • Как настроить HTML-форму для работы с моделями django?
  • Модуль python в django не импортирован правильно
  • Развертывание Google Analytics с помощью Django
  • Как использовать эскиз сорла? (Джанго)
  • Какова функция в Django, которая вызывает base.html и как я могу увидеть код python внутри base.html выполнить во время выполнения
  • Обслуживание файла Excel (xlsx) пользователю для загрузки в Django (Python)
  • django: wsgi.py? 'не может быть загружен как модуль Python'
  • Ткань запрашивает пароль, хотя я могу использовать SSH с учетными данными
  • Установка PIL для использования с Django в Mac OS X
  • Лучший способ сделать локальное серверное приложение с помощью python
  • Python - лучший язык программирования в мире.