Як налагодити Django, хороший спосіб? [зачинено]


587

Отже, я почав вчитися кодувати в Python і пізніше Django . Перші рази мені було важко дивитися на відстеження і насправді з'ясовувати, що я зробив не так і де синтаксична помилка. Зараз минув певний час, і я, певно, отримав звичайну процедуру налагодження свого коду Django. Оскільки це було зроблено на початку мого досвіду кодування, я сів і задумався, чи не так це, як я це роблю, і чи можна це зробити швидше. Зазвичай мені вдається знайти та виправити помилки в своєму коді, але мені цікаво, чи варто мені це робити швидше?

Зазвичай я просто використовую інформацію про налагодження, яку дає Джанго, коли це ввімкнено. Коли все закінчується так, як я думав, що це станеться, я сильно розбиваю потік коду з синтаксичною помилкою і дивлюся на змінні в цьому пункті потоку, щоб зрозуміти, де код робить щось інше, ніж те, що я хотів.

Але чи можна це покращити? Чи є якісь хороші інструменти чи кращі способи налагодження коду Django?


2
мені подобається користуватися інструментом django-debug-toolbar, її дуже зручно
Дієго Вініцій,

1
Або використовуйте вбудований в налагоджувач Python код Visual Studio Code, як пояснено тут code.visualstudio.com/docs/python/tutorial-django
Nick T

Відповіді:


536

Існує маса способів це зробити, але найпростішим є просто використовувати налагоджувач Python . Просто додайте наступний рядок до функції перегляду Джанго:

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 ++ , запропонований Анташем .

пудб , запропонований PatDuJour .

Використання налагоджувача Python у Django , запропонованого Seafangs .


64
+1 за пропозицію pdb. Однак варто зазначити, що це дійсно працює лише при використанні сервера розробки на вашій локальній машині, оскільки підказка з’явиться в консолі.
Даніель Роузман

12
Дивіться також django-pdb відповідно до моєї відповіді нижче. Дає вам manage.py runserver --pdbі manage.py test --pdbкоманди.
Том Крісті,

4
@Daniel, перегляньте rconsole про наявність консолі у вже запущеному екземплярі python.
Phob

12
Перевірте ipythonтакож. Ipdb, яка постачається разом із ipythonфункціями заповнення вкладок, кольоровим синтаксисом тощо :-).
hobbes3

3
Я вважав вашу відповідь корисною, але Джанго вічно висів на моїх точках перерви, коли я намагався налагодити тест. Тож я подивився і знайшов інформативну статтю, яка мені допомогла: v3.mike.tig.as/blog/2010/09/14/pdb
driftcatcher

228

Мені дуже подобається Werkzeug інтерактивний відладчик «s. Це схоже на сторінку налагодження Django, за винятком того, що ви отримуєте інтерактивну оболонку на кожному рівні трекбека. Якщо ви використовуєте розширення django , ви отримуєте runserver_plusкоманду управління, яка запускає сервер розробки та надає вам налагоджувач Werkzeug за винятками.

Звичайно, ви повинні запускати це лише локально, оскільки це дає кожному, хто має браузер, права виконувати довільний код python в контексті сервера.


2
Чи можливо використовувати заповнення вкладки в інтерактивній консолі, показаній у браузері? "Tab" просто переводить нас до наступної відкритої консолі, мені було цікаво, чи є комбінація клавіш, але я не зміг її знайти.
Аріель

@Ariel налагоджувач werkzeug не завершує вкладку.
Håken Lid

Якщо ви налагоджуєте API, ви можете спробувати django-rundbg, який додасть трохи повороту до налагоджувача Werkzeug.
elpaquete

Це лише доpython 3.3
Тимо

не підтримує канали github.com/pallets/werkzeug/isissue/1322
Paolo

166

Невелике скорочення для тегів шаблонів:

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

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

Це дуже приємний спосіб побачити, що сталося з вашим об’єктом, коли він потрапляє до шаблону.


1
це чудово. Ще одна річ, яку ви можете зробити, якщо у вас виникають проблеми із шаблонами, - це перейти на jinja2 (завантажений через труну) - це розширення шаблонів джанго, що, на мій погляд, є поліпшенням. Він також інтегрує шаблони та успадкування шаблонів у кадри відстеження краще, ніж джанго.
швидке множення

Це прекрасно. На жаль, важко побачити чистий спосіб інтегрувати це в базу коду, яка відмовляється від будь-яких зобов'язань, включаючи імпорт pdb.
Джон Кіпарський

83

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

Найважливішою є панель інструментів налагодження Django .

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

Сама Firebug також важлива для налагодження Javascript у будь-якій розробці програми. (Якщо ви, звичайно, маєте якийсь код JS).

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

Є більш корисні інструменти, як бульдозер для відстеження витоків пам’яті (є також інші хороші пропозиції, наведені у відповідях тут, на сторінці SO щодо відстеження пам’яті).


65

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


2
Найкраще в цьому - це просто працює і є абсолютно інтуїтивно зрозумілим. Просто натисніть ліворуч від рядка та натисніть кнопку налагодження. Він добре працює і для вихідного коду Django, якщо ви хочете краще зрозуміти, як працює внутрішній код. Минуло деякий час, перш ніж я помітив це, але ви можете поставити точки перерви в будь-який код у папці Зовнішні бібліотеки файлового навігатора.
Майкл Більстра

6
Варто зазначити, що PyCharm використовує налагоджувач PyDev під кришкою для отримання кредитів.
Медейрос


44

Майже все вже згадувалося, тому я лише додам, що замість pdb.set_trace()одного можна використовувати ipdb.set_trace (), який використовує iPython і, отже, є більш потужним (автозаповнення та інші смаколики). Для цього потрібен пакет ipdb, тому вам потрібно лишеpip install ipdb


2
Я рекомендую pdb ++, який забезпечує дуже корисний липкий режим.
Сандіп

34

Я підштовхнувся 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 , звичайно вітаються внески.


3
Це було б чудово, якби ви могли вказати номер файлу / рядка, на який потрібно перерватись (не лише перегляд).
Anson MacKeracher

До якого я можу залишити в коді, як коментарі, які є інертними в процесі виробництва. Можливо, це поганий парадим, але було б чудово ефективно знімати та застосовувати перерви вольово-невольно.
Гліцерин

Я встановив це нещодавно, але лише сьогодні з'ясував, щоб налаштувати "POST_MORTEM = True" у налаштуваннях мого розробника, як це підтверджено документами django-pdb Тома. Тепер я можу просто подорожувати, і коли справи йдуть погано, я потрапляю прямо до місця проблеми. Дякую Томе!
Джозеф Шеді

21

Найпростіший спосіб налагодження python - особливо для програмістів, які звикли до Visual Studio - це використання PTVS (Python Tools for Visual Studio). Етапи прості:

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

Якщо ви хочете налагодити Django за допомогою PTVS, вам потрібно зробити наступне:

  1. На вкладці Налаштування проекту - Загальне, встановіть "Файл запуску" на "management.py", вхідну програму програми Django.
  2. У налаштуваннях проекту - на вкладці «Налагодження» встановіть «Аргументи сценарію» на «runserver - noreload». Ключовим моментом є "--noreload" тут. Якщо ви не встановите його, ваші точки прориву не потраплять.
  3. Насолоджуйся цим.

1
Дякую, що працювало чудово. --Незавантаження було те, що нам було потрібно
Том Грюнер

Чи є функція налагодження на віддаленому сервері - подібно до Eclipse PyDev, яку я використовую в даний момент?
Даніель Соколовський

У мене з цим проблеми. Я дотримувався ваших кроків, але все ще не працює. Він зупиняється лише у точках перерви файлів * .py, а не у * .html.
blfuentes

16

Я дуже добре використовую pyDev з Eclipse, встановлюю точки перерви, входжу в код, переглядаю значення будь-яких об'єктів і змінних, спробуйте.


Вам доведеться запустити сервер розробників через eclipse (для досвіду налагодження з невеликими зусиллями). PyDev стверджує, що має віддалену налагодження, але ніколи не використовував її, я не можу реально говорити про якість досвіду розробки. Детальніше: pydev.org/manual_adv_remote_debugger.html
synthesizerpatel

2
Віддалений налагоджувач PyDev досить чудово працює з Dev-сервером Django. Просто переконайтеся, що у вас є "Коли файл буде змінено, автоматично перезавантажте модуль?" опція '' вимкнено '' в налаштуваннях Run / Debug PyDev. Інакше сервер розробників та pydev намагатимуться перезавантажити код під час налагодження, що змушує їх вкрай заплутатись.
coredumperror

12

Я використовую PyCharm і стою його поруч. Мене це коштувало трохи, але я мушу сказати, що перевага, яку я отримую з нього, - безцінна. Я спробував налагодження з консолі, і я даю людям багато кредитів, хто може це зробити, але для мене можливість візуального налагодження моїх додатків - це чудово.

Я мушу сказати, хоча PyCharm дійсно займає багато пам’яті. Але знову ж таки, нічого доброго у житті немає. Щойно вони вийшли з останньою версією 3. Також вона дуже добре поєднується з Django, Flask та Google AppEngine. Отже, загалом, я б сказав, що це чудовий зручний інструмент для будь-якого розробника.

Якщо ви його ще не використовуєте, я рекомендую отримати пробну версію протягом 30 днів, щоб переглянути потужність PyCharm. Я впевнений, що є й інші інструменти, наприклад, Aptana. Але я думаю, мені також подобається те, як виглядає PyCharm. Мені дуже зручно налагоджувати свої додатки там.


Це може бути перша IDE, яку я коли-небудь купував. Налагодження проекту у ВМ звучить як магія, за яку варто платити.
Роб Грант

10

Іноді, коли я хочу досліджувати певний метод, і виклик pdb є занадто громіздким, я б додав:

import IPython; IPython.embed()

IPython.embed() запускає оболонку IPython, яка має доступ до локальних змінних з того місця, де ви її викликаєте.


Зараз у мене є звичка робити це у верхній частині файлу, from IPython import embedі тоді, коли я хочу швидко додати точку розриву в коді, я пишу embed(). Економить час. Щоб не зациклюватися на петлях назавжди, я роблюembed();exit();
Mayank Jaiswal

@MayankJaiswal: У мене було ключове відображення на Vim, щоб вставити цей фрагмент (і подібні фрагменти для pudbта debugger;в JavaScript) у файл, який я редагую. Після закінчення я просто dd( видаляю весь рядок), щоб видалити точку розриву. Це дозволяє уникнути ризику введення рядка імпорту налагоджувача до контролю версій або необхідності попередньо встановити імпорт у верхній частині файлу.
Лежи Райан

10

З моєї точки зору, ми можемо розбити загальні завдання налагодження коду на три різних схеми використання:

  1. Щось підняло виняток : на допомогу налагоджувач Werkzeug runserver_plus '. Можливість запускати користувацький код на всіх рівнях слідів є вбивцею. І якщо ви повністю застрягли, ви можете створити історію, якою можна поділитися лише одним клацанням миші.
  2. Сторінка відображається, але результат невірний : знову ж, Веркзеуг гойдає. Щоб зробити точку перерви в коді, просто введіть assert Falseмісце, в якому ви хочете зупинитися.
  3. Код працює неправильно , але швидкий погляд не допомагає. Найімовірніше, алгоритмічна проблема. Зітхнути. Тоді я зазвичай запустити консоль отладчика PuDB : import pudb; pudb.set_trace(). Основна перевага перед [i] pdb полягає в тому, що PuDB (дивлячись, як у 80-і роки) робить налаштування спеціальних виразів годинника легким вітерцем. І налагодити купу вкладених циклів набагато простіше за допомогою GUI.

Ах, так, біди шаблонів. Найпоширеніша (для мене та моїх колег) проблема - це неправильний контекст: або у вас немає змінної, або ваша змінна не має атрибутів. Якщо ви використовуєте панель інструментів налагодження , просто огляньте контекст у розділі «Шаблони» або, якщо цього недостатньо, встановіть перерву в коді ваших поглядів відразу після заповнення вашого контексту.

Тому вона йде.


введіть менше, використовуючи простоimport pudb;pu.db
Славомір Ленарт

6

Я настійно рекомендую 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()), але я хотів виділити функцію обслуговування, оскільки вважаю її такою корисною.


epdb не оновлюється з 2011 року. Чи виникають у вас колись проблеми з його використанням на нових версіях Django та / або Python?
Сеперман

Я ніколи не стикався з проблемами, які використовують його проти Python 2 (конкретно 2.4-2.7). Я використовував його лише кілька днів тому. Я ніколи не пробував з Python 3.
Jacinda

1
Я використовую django 1.8 на python 2.7, і я не можу отримати epdb.connect, щоб поговорити з epdb.serve. Я просто отримую тайм-аут.
Девід Уотсон

6

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

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

Думав, що я просто передам це.

Також дуже корисна стаття про налагоджувачі python: https://zapier.com/engineering/debugging-python-boss/

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

Також можна запустити pyinstrument з командного рядка або імпортуючи як модуль.


PyCharm просто використовує PyDev, я думаю, не власний.
Роб Грант

6

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

  • c продовжити виконання
  • n перехід до наступного рядка в межах тієї ж функції
  • s перехід до наступного рядка в цій функції або викликаної функції
  • q вийти з налагоджувача / виконання

Також дивіться: https://poweruser.blog/setting-a-breakpoint-in-python-438e23fe6b28


5

Один з найкращих варіантів налагодження коду 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, наприклад
  • Порушення поточно запущених програм за допомогою введення коду (на підтримуваних системах)

Він має чудовий користувальницький інтерфейс на основі браузера. Радість у використанні! :)


Яка різниця з pdb?
Дунатотатос

4

Я використовую PyCharm та різні інструменти налагодження. Також є приємні статті про те, як легко налаштувати ці речі для новачків. Ви можете почати тут. Він розповідає про налагодження PDB та GUI взагалі з проектами Django. Сподіваюся, хтось від них виграє.



2

Згадано більшість варіантів альреді. Для друку контексту шаблону я створив для цього просту бібліотеку. Дивіться https://github.com/edoburu/django-debugtools

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

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

Для відображення змінних у <pre>тегу використовується спеціальний формат друку .


2

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


2

Для тих, хто може випадково додати pdb у трансляції, я можу запропонувати це розширення відповіді #Koobz:

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

2

З мого власного досвіду є два способи:

  1. використовувати ipdb , який є розширеним налагоджувачем, подібним до pdb.

    import ipdb;ipdb.set_trace()або breakpoint() (від python3.7)

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

    python manage.py shell


1

Я настійно пропоную використовувати ПТД.

import pdb
pdb.set_trace()

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

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


1

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

Для цього я б рекомендував використовувати WingIde. Так само, як і інші згадані IDE, приємні та прості у використанні, приємний макет, а також просте встановлення точок прориву оцінюють / змінюють стек і т. Д. Ідеально підходить для візуалізації того, що ваш код робить під час його переходу. Я великий прихильник цього.

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

Як уже згадувалося, django-debug-toolbar має істотне значення - https://github.com/django-debug-toolbar/django-debug-toolbar

І хоча це не явно інструмент налагодження чи аналізу - одне з моїх улюблених - це посередницьке програмне забезпечення для друку SQL, доступне у Django Snippets за адресою https://djangosnippets.org/snippets/290/

Це відобразить запити SQL, які генерував ваш погляд. Це дасть вам хороше розуміння того, що робить ORM, і якщо ваші запити ефективні або вам потрібно переробити код (або додати кешування).

Я вважаю, що це безцінне для того, щоб слідкувати за ефективністю запитів під час розробки та налагодження моєї програми.

Ще одна порада - я трохи змінив його для власного використання, щоб показувати лише резюме, а не SQL-заяву .... Тому я завжди використовую його під час розробки та тестування. Я також додав, що якщо len (connection.queries) перевищує попередньо визначений поріг, він відображає додаткове попередження.

Тоді, якщо я помічаю щось погане (з точки зору продуктивності чи кількості запитів), я повертаюсь назад на повне відображення операторів SQL, щоб точно побачити, що відбувається. Дуже зручно, коли ви працюєте над великим проектом Django з декількома розробниками.


1

використання pdbабо ipdb. Різниця між цими двома полягає в тому, що ipdb підтримує автоматичне завершення.

для pdb

import pdb
pdb.set_trace()

для ipdb

import ipdb
ipdb.set_trace()

Для виконання nклавіші звернення до нового рядка , для продовження натискання cклавіші. перевірити інші варіанти, використовуючиhelp(pdb)


0

Додаткова пропозиція.

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


0

Під час розробки додаючи швидку

assert False, value

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.