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

Мне это нравится, он работает на окне

def inputWdefault(prompt, default):
    bck = chr(8) * len(default)
    ret = input(prompt + default + bck)
    return ret or default
548
задан googletorp 28 February 2010 в 10:40
поделиться

12 ответов

Есть несколько способов сделать это, но самый простой - просто используйте отладчик 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 ++ , предложено Antash .

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

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

520
ответ дан 22 November 2019 в 22:13
поделиться

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

assert False, value

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

0
ответ дан Udi 28 February 2010 в 10:40
поделиться

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

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

0
ответ дан JL Peyret 28 February 2010 в 10:40
поделиться

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

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

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

2
ответ дан Chris 28 February 2010 в 10:40
поделиться

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

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

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

12
ответ дан Khan 28 February 2010 в 10:40
поделиться

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

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

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

  1. В настройках проекта - вкладка «Общие» установите для «Startup File» значение «manage.py», точку входа в программу Django.
  2. В настройках проекта - вкладка «Отладка» установите «Аргументы скрипта» на «runserver --noreload». Ключевым моментом здесь является «--noreload». Если вы не установите его, ваши контрольные точки не будут достигнуты.
  3. Наслаждайтесь.
21
ответ дан Sebastiaan M 28 February 2010 в 10:40
поделиться

I really like Werkzeug's interactive debugger. It's similar to Django's debug page, except that you get an interactive shell on every level of the traceback. If you use the django-extensions, you get a runserver_plus managment command which starts the development server and gives you Werkzeug's debugger on exceptions.

Of course, you should only run this locally, as it gives anyone with a browser the rights to execute arbitrary python code in the context of the server.

224
ответ дан 22 November 2019 в 22:13
поделиться

I use pyDev with Eclipse really good, set break points, step into code, view values on any objects and variables, try it.

16
ответ дан 22 November 2019 в 22:13
поделиться

There are a few tools that cooperate well and can make your debugging task easier.

Most important is the Django debug toolbar.

Then you need good logging using the Python logging facility. You can send logging output to a log file, but an easier option is sending log output to firepython. To use this you need to use the Firefox browser with the firebug extension. Firepython includes a firebug plugin that will display any server-side logging in a Firebug tab.

Firebug itself is also critical for debugging the Javascript side of any app you develop. (Assuming you have some JS code of course).

I also liked django-viewtools for debugging views interactively using pdb, but I don't use it that much.

There are more useful tools like dozer for tracking down memory leaks (there are also other good suggestions given in answers here on SO for memory tracking).

82
ответ дан 22 November 2019 в 22:13
поделиться

Небольшая подсказка для тегов шаблона:

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

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

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

161
ответ дан 22 November 2019 в 22:13
поделиться

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

43
ответ дан 22 November 2019 в 22:13
поделиться

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

62
ответ дан 22 November 2019 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: