it-swarm.com.de

Wie man in Django debuggt, der gute Weg?

Also fing ich an, in Python und später Django zu lernen. Das erste Mal war es schwer, Tracebacks anzusehen und tatsächlich herauszufinden, was ich falsch gemacht habe und wo der Syntaxfehler war. Es ist nun einige Zeit vergangen und auf dem Weg dorthin, denke ich, habe ich eine Routine beim Debuggen meines Django-Codes. Da dies zu einem frühen Zeitpunkt meiner Codierungserfahrung gemacht wurde, setzte ich mich hin und fragte mich, ob dies ineffizient war und schneller gemacht werden konnte. Normalerweise gelingt es mir, die Fehler in meinem Code zu finden und zu beheben, aber ich frage mich, ob ich es schneller machen sollte.

Normalerweise verwende ich nur die Debug-Informationen, die Django bei Aktivierung gibt. Wenn die Dinge so enden, wie ich es mir vorgestellt hatte, breche ich den Code-Fluss mit einem Syntaxfehler auf und schaue mir die Variablen an diesem Punkt im Fluss an, um herauszufinden, wo der Code etwas anderes tut als ich wollte.

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

517
googletorp

Es gibt eine Reihe von Möglichkeiten, dies zu tun, aber am einfachsten ist es, Den Python-Debugger zu verwenden. Fügen Sie einfach die folgende Zeile in eine Django-Ansichtsfunktion ein:

import pdb; pdb.set_trace()

Wenn Sie versuchen, diese Seite in Ihren Browser zu laden, wird der Browser hängen bleiben und Sie erhalten die Aufforderung, mit dem eigentlichen Ausführungscode zu debuggen.

Es gibt jedoch andere Optionen (ich empfehle sie nicht):

* return HttpResponse({variable to inspect})

* print {variable to inspect}

* raise Exception({variable to inspect})

Der Python-Debugger (pdb) wird jedoch für alle Arten von Python-Code dringend empfohlen. Wenn Sie sich bereits in pdb befinden, möchten Sie auch einen Blick auf IPDB werfen, der ipython zum Debuggen verwendet.

Weitere nützliche Erweiterungen für pdb sind

pdb ++ , vorgeschlagen von Antash .

pudb , vorgeschlagen von PatDuJour .

Verwenden des Python-Debuggers in Django , vorgeschlagen von Seafangs .

482
simplyharsh

Ich mag den interaktiven Debugger von Werkzeug . Sie ähnelt der Debug-Seite von Django, außer dass Sie auf jeder Ebene des Tracebacks eine interaktive Shell erhalten. Wenn Sie die Django-Erweiterungen verwenden, erhalten Sie den Befehl runserver_plus managment, der den Entwicklungsserver startet und Ihnen den Debugger von Werkzeug für Ausnahmen gibt.

Natürlich sollten Sie dies nur lokal ausführen, da jeder, der über einen Browser verfügt, die Berechtigung hat, beliebigen Python-Code im Kontext des Servers auszuführen.

219

Ein kleiner Quickie für Template-Tags:

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

Innerhalb einer Vorlage können Sie {{ template_var|pdb }} ausführen und eine pdb-Sitzung eingeben (vorausgesetzt, Sie betreiben den lokalen Entwicklungsserver), in der Sie element auf den Inhalt Ihres Herzens überprüfen können.

Es ist eine sehr schöne Möglichkeit zu sehen, was mit Ihrem Objekt passiert ist, wenn es an der Vorlage ankommt. 

155
Koobz

Es gibt einige Tools, die gut zusammenarbeiten und die Debugging-Aufgabe vereinfachen können.

Am wichtigsten ist die Debug-Symbolleiste Django .

Dann benötigen Sie eine gute Protokollierung mit Python logging . Sie können die Protokollierungsausgabe an eine Protokolldatei senden. Eine einfachere Option ist das Senden der Protokollausgabe an firepython . Um dies zu verwenden, müssen Sie den Firefox-Browser mit der Erweiterung firebug verwenden. Firepython enthält ein Firebug-Plugin, das alle serverseitigen Protokolle auf einer Firebug-Registerkarte anzeigt.

Firebug selbst ist auch für das Debuggen der Javascript-Seite einer von Ihnen entwickelten App von entscheidender Bedeutung. (Vorausgesetzt, Sie haben natürlich JS-Code).

Ich mochte auch Django-viewtools , um Ansichten interaktiv mit pdb zu debuggen, aber ich benutze es nicht so sehr.

Es gibt weitere nützliche Tools wie Dozer zum Aufspüren von Speicherverlusten (weitere gute Vorschläge finden Sie in den Antworten hier auf SO zum Speicher-Tracking).

80
Van Gale

Ich benutze PyCharm (dieselbe pydev-Engine wie Eclipse). Hilft mir wirklich, visuell in der Lage zu sein, durch meinen Code zu gehen und zu sehen, was passiert.

54
PhoebeB

Fast alles wurde bisher erwähnt, daher muss ich nur hinzufügen, dass anstelle von pdb.set_trace() ipdb.set_trace () verwendet werden kann, das iPython verwendet und daher leistungsfähiger ist (Autocomplete und andere Goodies). Dies erfordert ein ipdb-Paket, sodass Sie nur pip install ipdb

41

Ich habe Django-pdb nach PyPI . Es ist eine einfache Anwendung, die bedeutet, dass Sie Ihren Quellcode nicht jedes Mal bearbeiten müssen, wenn Sie in pdb einsteigen möchten.

Die Installation ist nur ...

  1. pip install Django-pdb
  2. Fügen Sie 'Django_pdb' zu Ihrem INSTALLED_APPS hinzu

Sie können jetzt Folgendes ausführen: manage.py runserver --pdb, um am Anfang jeder Ansicht in pdb einzubrechen ...

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)

Und führe Folgendes aus: manage.py test --pdb, um bei Testfehlern/Fehlern in pdb zu brechen ...

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)

Die auf GitHub gehosteten Projekte sind natürlich willkommen.

32
Tom Christie

Die einfachste Möglichkeit zum Debuggen von Python - insbesondere für Programmierer, die in Visual Studio verwendet werden - ist die Verwendung von PTVS (Python-Tools für Visual Studio). Die Schritte sind einfach: 

  1. Laden Sie es herunter und installieren Sie es von http://pytools.codeplex.com/
  2. Setzen Sie Haltepunkte und drücken Sie F5. 
  3. Ihr Haltepunkt ist erreicht, Sie können die Variablen so einfach anzeigen/ändern wie das Debuggen von C #/C++ - Programmen. 
  4. Das ist alles :) 

Wenn Sie Django mit PTVS debuggen möchten, müssen Sie Folgendes tun: 

  1. Setzen Sie in den Projekteinstellungen - Registerkarte "Allgemein" für "Startdatei" den Eintrag "manage.py", den Einstiegspunkt des Django-Programms. 
  2. Legen Sie unter Projekteinstellungen - Registerkarte "Debuggen" für "Skriptargumente" den Wert "runserver --noreload" fest. Der Schlüsselpunkt ist hier "--noreload". Wenn Sie es nicht festlegen, werden Ihre Haltepunkte nicht getroffen. 
  3. Geniesse es.
20
029xue

Ich benutze pyDev mit Eclipse wirklich gut, setze Haltepunkte, gehe in Code, zeige Werte für alle Objekte und Variablen, versuche es.

15
gath

Ich benutze PyCharm und stehe dazu. Es hat mich ein bisschen gekostet, aber ich muss sagen, dass der Vorteil, den ich daraus bekomme, unbezahlbar ist. Ich habe das Debuggen von der Konsole aus versucht und ich gebe den Leuten eine Menge Anerkennung, wer das kann, aber für mich ist es gut, meine Anwendungen visuell zu debuggen.

Ich muss allerdings sagen, dass PyCharm viel Speicher braucht. Andererseits ist nichts Gutes im Leben frei. Sie kamen gerade mit ihrer neuesten Version 3. Sie ist auch sehr gut mit Django, Flask und Google AppEngine kompatibel. Alles in allem würde ich sagen, es ist ein sehr nützliches Werkzeug für jeden Entwickler.

Wenn Sie es noch nicht verwenden, würde ich empfehlen, die Testversion 30 Tage lang herunterzuladen, um sich die Leistungsfähigkeit von PyCharm anzusehen. Ich bin mir sicher, dass es auch andere Tools gibt, wie zum Beispiel Aptana. Aber ich schätze, ich mag die Art, wie PyCharm aussieht. Ich fühle mich sehr wohl beim Debuggen meiner Apps.

10
Khan

Aus meiner Sicht könnten wir gängige Code-Debugging -Aufgaben in drei unterschiedliche Verwendungsmuster unterteilen:

  1. Etwas hat eine Ausnahme: runserver_plus 'Werkzeug-Debugger zur Rettung ausgelöst. Die Möglichkeit, benutzerdefinierten Code auf allen Trace-Ebenen auszuführen, ist ein Killer. Und wenn Sie völlig festgefahren sind, können Sie eine Gist erstellen, die Sie mit einem Klick teilen können.
  2. Die Seite wird gerendert, aber das Ergebnis ist falsch: Werkzeug schaukelt. Um einen Haltepunkt im Code zu erstellen, geben Sie einfach assert False an der Stelle ein, an der Sie anhalten möchten.
  3. Code funktioniert falsch, aber der schnelle Blick hilft nicht. Höchstwahrscheinlich ein algorithmisches Problem. Seufzer. Dann starte ich normalerweise einen Konsolendebugger PuDB : import pudb; pudb.set_trace(). Der Hauptvorteil gegenüber [i] pdb besteht darin, dass PuDB (während Sie aussehen wie in den 80ern), das Einstellen von benutzerdefinierten Uhrausdrücken zum Kinderspiel macht. Das Debuggen einer Reihe verschachtelter Schleifen ist mit einer GUI wesentlich einfacher.

Ah ja, die Leiden der Vorlagen. Das häufigste Problem (für mich und meine Kollegen) ist ein falscher Kontext: Entweder haben Sie keine Variable oder Ihre Variable hat kein Attribut. Wenn Sie debug toolbar verwenden, überprüfen Sie einfach den Kontext im Abschnitt "Vorlagen". Wenn dies nicht ausreicht, legen Sie eine Unterbrechung im Code Ihrer Ansichten fest, nachdem der Kontext gefüllt ist.

So geht es.

9
Alex Morozov

Manchmal, wenn ich in einer bestimmten Methode herumfahren und pdb beschwören würde, ist das zu umständlich, würde ich hinzufügen:

import IPython; IPython.embed()

IPython.embed() startet eine IPython-Shell, die von dort aus auf die lokalen Variablen zugreifen kann. 

8
Lie Ryan

Ich habe gerade wdb gefunden ( http://www.rkblog.rk.edu.pl/w/p/debugging-python-code-browser-wdb-debugger/?goback=%2Egde_25827_member_255996401 ). Es hat eine ziemlich schöne Benutzeroberfläche/GUI mit allem Schnickschnack. Autor sagt das über wdb -

"Es gibt IDEs wie PyCharm, die über eigene Debugger verfügen. Sie bieten ähnliche oder gleichwertige Funktionen ... Um sie jedoch zu verwenden, müssen Sie diese spezifischen IDEs verwenden (und einige davon sind nicht frei oder möglicherweise nicht für alle verfügbar) Plattformen). Wählen Sie das richtige Werkzeug für Ihre Bedürfnisse aus. "

Ich dachte, ich würde es einfach weitergeben.

Auch ein sehr hilfreicher Artikel über Python-Debugger:https://zapier.com/engineering/debugging-python-boss/

Schließlich, wenn Sie einen schönen grafischen Ausdruck Ihres Callstacks in Django anzeigen möchten, checken Sie: https://github.com/joerick/pyinstrument . Fügen Sie einfach pyinstrument.middleware.ProfilerMiddleware zu MIDDLEWARE_CLASSES hinzu, und fügen Sie am Ende der Anforderungs-URL? Profile hinzu, um den Profiler zu aktivieren. 

Kann pyinstrument auch von der Kommandozeile aus ausführen oder als Modul importieren.

6
Hutch

Ich empfehle epdb (Extended Python Debugger). 

https://bitbucket.org/dugan/epdb

Eine Sache, die ich an epdb für das Debuggen von Django oder anderen Python-Webservern liebe, ist der Befehl epdb.serve (). Dadurch wird eine Ablaufverfolgung festgelegt und auf einem lokalen Port ausgeführt, zu dem Sie eine Verbindung herstellen können. Typischer Anwendungsfall:

Ich habe die Ansicht, dass ich Schritt für Schritt durchgehen möchte. Ich füge Folgendes an der Stelle ein, an der ich die Spur einstellen möchte.

import epdb; epdb.serve()

Sobald dieser Code ausgeführt wird, öffne ich einen Python-Interpreter und verbinde mich mit der Server-Instanz. Ich kann alle Werte analysieren und den Code mit den Standard-pdb-Befehlen wie n, s usw. durchgehen.

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

Und tonnenweise mehr darüber, wie Sie die epdb-Hilfe jederzeit eingeben können.

Wenn Sie mehrere epdb-Instanzen gleichzeitig bedienen oder eine Verbindung herstellen möchten, können Sie den Port angeben, an dem die Überwachung erfolgen soll (Standardeinstellung ist 8080). D.h.

import epdb; epdb.serve(4242)

>> import epdb; epdb.connect(Host='192.168.3.2', port=4242)

Der Host verwendet standardmäßig 'localhost', falls nicht angegeben. Ich habe es hier gezeigt, um zu zeigen, wie Sie dies verwenden können, um etwas anderes als eine lokale Instanz zu debuggen, wie einen Entwicklungsserver in Ihrem lokalen LAN. Wenn Sie dies tun, müssen Sie natürlich darauf achten, dass die eingestellte Ablaufverfolgung niemals auf Ihren Produktionsserver gelangt!

Als kurze Anmerkung können Sie immer noch dasselbe tun wie die akzeptierte Antwort mit epdb (import epdb; epdb.set_trace()), aber ich wollte die Servefunktionalität hervorheben, da ich sie so nützlich gefunden habe.

6
Jacinda

Ich benutze PyCharm und verschiedene Debug-Tools. Habe auch einen schönen Artikel über die einfache Einrichtung dieser Dinge für Anfänger. Sie können hier anfangen. Es berichtet allgemein über das PDB- und GUI-Debugging bei Django-Projekten. Hoffe, jemand würde von ihnen profitieren.

3
garmoncheg

Fügen Sie import pdb; pdb.set_trace() in der entsprechenden Zeile im Python-Code ein und führen Sie ihn aus. Die Ausführung wird mit einer interaktiven Shell beendet. In der Shell können Sie Python-Code ausführen (d. H. Druckvariablen) oder Befehle wie die folgenden verwenden:

  • c Ausführung fortsetzen
  • n Springt zur nächsten Zeile innerhalb derselben Funktion
  • s Springt zur nächsten Zeile in dieser Funktion oder einer aufgerufenen Funktion
  • q den Debugger/die Ausführung beenden

Siehe auch: https://poweruser.blog/setting-a-breakpoint-in-python-438e23fe6b28

2
Chris

Wenn Sie Aptana für die Django-Entwicklung verwenden, beachten Sie Folgendes: http://www.youtube.com/watch?v=qQh-UQFltJQ

Wenn nicht, ziehen Sie es in Betracht.

2
user1144616

Für diejenigen, die versehentlich pdb in Live-Commits hinzufügen können, kann ich diese Erweiterung von #Koobz vorschlagen:

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

Die meisten Optionen werden bereits erwähnt . Um den Kontext der Vorlage zu drucken, habe ich eine einfache Bibliothek dafür erstellt . Siehe https://github.com/edoburu/Django-debugtools

Sie können es verwenden, um den Vorlagenkontext ohne {% load %}-Konstrukt zu drucken:

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

Es verwendet ein benutzerdefiniertes pprint-Format, um die Variablen in einem <pre>-Tag anzuzeigen.

2
vdboor

Ich finde, dass Visual Studio Code hervorragend zum Debuggen von Django-Apps geeignet ist. Die standard Python-Parameter launch.json führen python manage.py mit dem angefügten Debugger aus, sodass Sie Haltepunkte festlegen und Ihren Code nach Belieben schrittweise durchlaufen können.

2
Noah MacCallum

Eine der besten Möglichkeiten zum Debuggen von Django-Code ist über wdb: https://github.com/Kozea/wdb

wdb arbeitet mit Python 2 (2.6, 2.7), Python 3 (3.2, 3.3, 3.4, 3.5) und Pypy. Noch besser ist es, ein Python-2-Programm mit einem auf Python 3 laufenden Wdb-Server zu debuggen oder ein Programm zu debuggen, das auf einem Computer läuft, auf dem ein Debug-Server auf einem anderen Computer innerhalb einer Webseite auf einem dritten Computer läuft! __. Umso besser ist es jetzt möglich, einen aktuell ausgeführten Python-Prozess/-Thread mithilfe von Code-Injection über das Web-Interface anzuhalten. (Dies setzt voraus, dass gdb und ptrace aktiviert sind) Mit anderen Worten, es ist eine sehr erweiterte Version von pdb direkt in Ihrem Browser mit Nice-Funktionen.

Installieren und starten Sie den Server und fügen Sie in Ihrem Code Folgendes hinzu:

import wdb
wdb.set_trace()

Laut Autor sind die Hauptunterschiede bezüglich pdb:

Für diejenigen, die das Projekt nicht kennen, ist wdb ein Python-Debugger wie pdb, aber mit einem glatten Web-Frontend und vielen zusätzlichen Funktionen, wie z.

  • Quellensyntax-Hervorhebung 
  • Visuelle Haltepunkte 
  • Interaktive Code-Vervollständigung mit jedi 
  • Anhaltende Haltepunkte 
  • Tiefe Objektprüfung mit Unterstützung für Maus-Multithreading/Multiprocessing
  • Remote-Debugging
  • Ausdrücke beobachten 
  • In der Debugger-Code-Edition 
  • Beliebte Webserver-Integration, um bei Fehlern zu brechen 
  • Im Ausnahmefall während des Trace (nicht post mortem) im Gegensatz zum werkzeug-Debugger
  • Einspielen der aktuell laufenden Programme durch Code-Injection (auf unterstützten Systemen)

Es hat eine großartige Browser-basierte Benutzeroberfläche. Eine Freude zu benutzen! :)

2
fessacchiotto

Nach meiner Erfahrung gibt es zwei Möglichkeiten:

  1. verwenden Sie ipdb , ein erweiterter Debugger, der pdb mag.

    import ipdb;ipdb.set_trace() oder breakpoint() (von python3.7)

  2. verwenden Sie Django Shell, verwenden Sie einfach den folgenden Befehl. Dies ist sehr hilfreich, wenn Sie eine neue Ansicht entwickeln.

    python manage.py Shell

1
Mark White

ich schlage vor, PDB zu verwenden.

import pdb
pdb.set_trace()

Sie können alle Variablenwerte überprüfen, in die Funktion einsteigen und vieles mehr. https://docs.python.org/2/library/pdb.html

ich verwende die Django-Debug-Toolbar https://github.com/Django-debug-toolbar/Django-debug-toolbar

1
nitansh bareja

Wie in anderen Beiträgen hier erwähnt, ist das Festlegen von Haltepunkten in Ihrem Code und das Durchlaufen des Codes, um zu sehen, ob er sich erwartungsgemäß verhält, eine gute Möglichkeit, etwas wie Django zu lernen, bis Sie ein gutes Gefühl dafür haben, wie sich alles verhält - und was Ihr Code ist macht.

Dafür würde ich empfehlen, WingIde zu verwenden. Genau wie bei anderen erwähnten IDEs. Nizza und einfach zu bedienen, Nizza Layout und auch einfach zu definierende Haltepunkte. Den Stack usw. auswerten/ändern. Ideal, um zu visualisieren, was Ihr Code macht, wenn Sie ihn durchgehen. Ich bin ein großer Fan davon.

Ich verwende auch PyCharm - es verfügt über eine hervorragende statische Code-Analyse und kann manchmal helfen, Probleme zu erkennen, bevor Sie feststellen, dass sie vorhanden sind.

Wie bereits erwähnt, ist die Django-Debug-Toolbar unerlässlich - https://github.com/Django-debug-toolbar/Django-debug-toolbar

Und obwohl es nicht explizit ein Debug- oder Analysewerkzeug ist - einer meiner Favoriten ist SQL Printing Middleware von Django Snippets unter https://djangosnippets.org/snippets/290/

Dadurch werden die von Ihrer Ansicht generierten SQL-Abfragen angezeigt. Dadurch erhalten Sie ein gutes Gefühl dafür, was der ORM macht, und ob Ihre Abfragen effizient sind oder Sie Ihren Code überarbeiten müssen (oder Caching hinzufügen).

Ich finde es von unschätzbarem Wert, die Abfrageperformance während der Entwicklung und beim Debuggen meiner Anwendung im Auge zu behalten. 

Nur ein weiterer Tipp - Ich habe es leicht für meinen eigenen Gebrauch modifiziert, um nur die Zusammenfassung und nicht die SQL-Anweisung anzuzeigen. Daher verwende ich sie immer beim Entwickeln und Testen. Ich habe auch hinzugefügt, dass, wenn die len (connection.queries) größer als ein vordefinierter Schwellenwert ist, eine zusätzliche Warnung angezeigt wird.

Wenn ich etwas Schlechtes (aus Sicht der Leistung oder Anzahl der Abfragen) entdecke, schalte ich die gesamte Anzeige der SQL-Anweisungen wieder ein, um genau zu sehen, was los ist. Sehr praktisch, wenn Sie an einem großen Django-Projekt mit mehreren Entwicklern arbeiten.

1
IanH

Während der Entwicklung fügen Sie schnell hinzu

assert False, value

hilft bei der Diagnose von Problemen in Ansichten oder anderswo, ohne dass ein Debugger verwendet werden muss.

0
Udi

Ein zusätzlicher Vorschlag. 

Sie können Nosetests und pdb gemeinsam nutzen, indem Sie pdb.set_trace() manuell in Ihre Ansichten einfügen. Der Vorteil ist, dass Sie Fehlerzustände beim ersten Start beobachten können, möglicherweise im Code von Drittanbietern.

Hier ist heute ein Fehler für mich.

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ß, das bedeutet, dass ich den Konstruktor für das Formular vermasselt habe, und ich habe sogar eine gute Vorstellung davon, welches Feld ein Problem ist. Kann ich pdb verwenden, um zu sehen, über welche knusprigen Formulare sich beschwert, innerhalb einer Vorlage?

Ja, ich kann. Verwenden der Option --pdb für Nasentests:

tests$ nosetests test_urls_catalog.py --pdb

Sobald ich eine Ausnahme getroffen habe (einschließlich derer, die elegant behandelt werden), stoppt pdb dort, wo 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 ist es klar, dass meine Entscheidungen für den knusprigen Feldkonstruktor eher eine Liste innerhalb einer Liste waren als eine Liste/Tupel von Tupeln.

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

Das nette ist, dass diese pdb innerhalb von knusprigem Code stattfindet, nicht meins, und ich musste es nicht manuell einfügen.

0
JL Peyret

verwenden Sie pdb oder ipdb. Unterschied zwischen diesen beiden ist, dass ipdb die automatische Vervollständigung unterstützt.

für pdb

import pdb
pdb.set_trace()

für ipdb

import ipdb
ipdb.set_trace()

Zum Ausführen der neuen Zeile drücken Sie die n-Taste, um fortzufahren, drücken Sie die c-Taste . Überprüfen Sie weitere Optionen mit help(pdb)

0
Abdul Gaffar