Мне это нравится, он работает на окне
def inputWdefault(prompt, default):
bck = chr(8) * len(default)
ret = input(prompt + default + bck)
return ret or default
Есть несколько способов сделать это, но самый простой - просто используйте отладчик 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 -
Использование отладчика Python в Django , предложено Морские клыки .
Во время разработки добавление быстрого
assert False, value
может помочь диагностировать проблемы в представлениях или где-либо еще, без необходимости использовать отладчик.
Дополнительное предложение.
Вы можете использовать тесты носа и 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, а не в моем, и мне не нужно было вставлять его вручную.
Добавьте import pdb; pdb.set_trace()
в соответствующую строку в коде Python и выполните его. Выполнение остановится с помощью интерактивной оболочки. В оболочке вы можете выполнить код Python (то есть переменные печати) или использовать такие команды, как:
c
продолжить выполнение n
шаг к следующей строке в той же function s
перейти к следующей строке в этой функции или вызываемой функции q
выйти из отладчика / выполнения Также см .: https://poweruser.blog/setting-a-breakpoint-in-python-438e23fe6b28
Я использую PyCharm и поддерживаю его до конца. Это стоило мне немного, но я должен сказать, что преимущество, которое я получаю от этого, бесценно. Я попробовал отладку с консоли, и я очень благодарен людям, которые могут это сделать, но для меня возможность визуальной отладки моих приложений - это замечательно.
Я должен сказать, что PyCharm действительно занимает много памяти. Но опять же, ничего хорошего в жизни не бывает бесплатным. Они только что вышли со своей последней версией 3. Она также очень хорошо работает с Django, Flask и Google AppEngine. В общем, я бы сказал, что это отличный удобный инструмент для любого разработчика.
Если вы еще не используете его, я рекомендую получить пробную версию на 30 дней, чтобы взглянуть на возможности PyCharm. Я уверен, что есть и другие инструменты, такие как Aptana. Но я думаю, мне просто нравится, как выглядит PyCharm. Я чувствую себя очень комфортно, отлаживая свои приложения там.
Самый простой способ отладки python - особенно для программистов, которые привыкли к Visual Studio - это использование PTVS (Python Tools for Visual Studio). Шаги просты:
Если вы хотите отладить Django с помощью PTVS, вам нужно сделать следующее:
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.
I use pyDev with Eclipse really good, set break points, step into code, view values on any objects and variables, try it.
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).
Небольшая подсказка для тегов шаблона:
@register.filter
def pdb(element):
import pdb; pdb.set_trace()
return element
Теперь внутри шаблона вы можете сделать {{template_var | pdb}}
и войти в сеанс pdb (если у вас запущен локальный сервер разработки) где вы можете проверить элемент
сколько душе угодно.
Это очень хороший способ увидеть, что случилось с вашим объектом, когда он попадает в шаблон.
До сих пор было упомянуто почти все, поэтому я только добавлю, что вместо pdb.set_trace ()
можно использовать ipdb.set_trace () , который использует iPython и, следовательно, более мощный (автозаполнение и прочие вкусности). Для этого требуется пакет ipdb, поэтому вам нужно только pip install ipdb
Я использую PyCharm (тот же движок pydev, что и eclipse). Действительно помогает мне визуально пройти через мой код и увидеть, что происходит.