657 Stimmen

Wie debuggt man in Django, auf die gute Art?

Also habe ich angefangen, Code zu lernen in Python und später Django . Die ersten Male war es schwer, Tracebacks zu betrachten und tatsächlich herauszufinden, was ich falsch gemacht habe und wo der Syntaxfehler lag. Inzwischen ist einige Zeit vergangen und ich denke, ich habe inzwischen eine gewisse Routine im Debuggen meines Django-Codes. Da ich das schon früh in meiner Programmierpraxis gemacht habe, habe ich mich hingesetzt und mich gefragt, ob die Art und Weise, wie ich das gemacht habe, ineffektiv war und ob man das schneller machen könnte. Normalerweise schaffe ich es, die Fehler in meinem Code zu finden und zu korrigieren, aber ich frage mich, ob ich es schneller machen sollte.

Ich benutze normalerweise nur die Debug-Informationen, die Django ausgibt, wenn sie aktiviert sind. Wenn die Dinge so enden, wie ich es mir gedacht habe, unterbreche ich den Codefluss oft mit einem Syntaxfehler und schaue mir die Variablen an diesem Punkt im Fluss an, um herauszufinden, wo der Code etwas anderes tut als das, was ich wollte.

Aber kann dies verbessert werden? Gibt es gute Tools oder bessere Möglichkeiten, Ihren Django-Code zu debuggen?

3 Stimmen

Ich verwende gerne django-debug-toolbar, es ist sehr praktisch

3 Stimmen

Oder verwenden Sie den in Visual Studio Code integrierten Python-Debugger, wie hier beschrieben code.visualstudio.com/docs/python/tutorial-django

0voto

JL Peyret Punkte 8809

Eine zusätzliche Anregung.

Sie können Folgendes nutzen nosetests y pdb zusammen, sondern injizieren pdb.set_trace() in Ihren Ansichten manuell. Der Vorteil ist, dass Sie Fehlerbedingungen beobachten können, wenn sie zum ersten Mal auftreten, möglicherweise im Code von Drittanbietern.

Hier ist ein Fehler für mich heute.

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 %}

Nun, ich weiß, dass dies bedeutet, dass ich den Konstruktor für das Formular verpfuscht habe, und ich habe sogar eine gute Vorstellung davon, welches Feld ein Problem ist. Aber, kann ich pdb verwenden, um zu sehen, was crispy Formen beschwert sich über, innerhalb einer Vorlage ?

Ja, das kann ich. Mit dem --pdb Option bei Nosetests:

tests$ nosetests test_urls_catalog.py --pdb

Sobald ich auf eine Ausnahme stoße (einschließlich derjenigen, die ordnungsgemäß behandelt werden), hält pdb an der Stelle an, an der es passiert, und ich kann mich umsehen.

  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)         

Nun, es ist klar, dass meine Entscheidungen Argument für die knusprigen Feld Konstruktor war, wie es eine Liste innerhalb einer Liste war, anstatt eine Liste/Tupel von Tupeln.

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

Das Schöne daran ist, dass dieses pdb im Code von crispy stattfindet, nicht in meinem, und ich es nicht manuell einfügen musste.

0voto

Udi Punkte 26826

Während der Entwicklung kann das Hinzufügen einer schnellen

assert False, value

kann bei der Diagnose von Problemen in Ansichten oder an anderen Stellen helfen, ohne dass ein Debugger verwendet werden muss.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X