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

12voto

Alex Morozov Punkte 5477

Aus meiner Sicht könnten wir die gemeinsamen Code-Fehlersuche Aufgaben in drei verschiedene Nutzungsmuster:

  1. Etwas hat eine Ausnahme ausgelöst : runserver_plus ' Werkzeug-Debugger zur Rettung. Die Möglichkeit, benutzerdefinierten Code auf allen Trace-Ebenen auszuführen, ist ein echter Knaller. Und wenn Sie nicht weiterkommen, können Sie mit einem Klick eine Gist erstellen, um sie zu teilen.
  2. Seite wird gerendert, aber die Ergebnis ist falsch Nochmals: Werkzeug rockt. Um einen Haltepunkt im Code zu setzen, geben Sie einfach ein assert False an dem Ort, an dem Sie anhalten möchten.
  3. Code funktioniert falsch aber der kurze Blick hilft nicht weiter. Wahrscheinlich ist es ein algorithmisches Problem. Seufz. Dann starte ich normalerweise einen Konsolendebugger PuDB : import pudb; pudb.set_trace() . Der Hauptvorteil gegenüber [i]pdb ist, dass PuDB (obwohl es aussieht, als wäre man in den 80er Jahren) das Einstellen von benutzerdefinierten Überwachungsausdrücken zu einem Kinderspiel macht. Und Debuggen eine Reihe von verschachtelten Schleifen ist viel einfacher mit einer GUI.

Ah, ja, die Probleme mit den 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 Folgendes verwenden Debug-Symbolleiste Überprüfen Sie einfach den Kontext im Abschnitt "Vorlagen", oder, falls dies nicht ausreicht, setzen Sie eine Unterbrechung in den Code Ihrer Ansichten, nachdem der Kontext aufgefüllt wurde.

So ist es.

0 Stimmen

Weniger tippen und nur import pudb;pu.db

12voto

Khan Punkte 137

Ich benutze PyCharm und stehen dazu, bis zum Ende. Es hat mich ein wenig gekostet, aber ich muss sagen, dass der Vorteil, den ich daraus ziehe, unbezahlbar ist. Ich habe versucht, von der Konsole aus zu debuggen, und ich rechne es den Leuten hoch an, die das können, aber für mich ist es großartig, meine Anwendung(en) visuell debuggen zu können.

Ich muss allerdings sagen, PyCharm benötigt eine Menge Speicherplatz. Aber andererseits ist nichts Gutes im Leben umsonst. Sie kamen gerade mit ihrer neuesten Version 3. Es spielt auch sehr gut mit Django, Flask und Google AppEngine. Alles in allem würde ich sagen, dass es ein großartiges, praktisches Tool für jeden Entwickler ist.

Wenn Sie es noch nicht benutzen, empfehle ich Ihnen, die Testversion für 30 Tage zu erwerben, um sich von der Leistungsfähigkeit von PyCharm zu überzeugen. Ich bin sicher, dass es auch andere Tools gibt, wie z.B. Aptana. Aber ich glaube, mir gefällt einfach auch die Art und Weise, wie PyCharm aussieht. Ich fühle mich beim Debuggen meiner Anwendungen dort sehr wohl.

0 Stimmen

Es könnte die erste IDE sein, die ich je kaufe. Das Debuggen eines Projekts in einer VM klingt nach Magie, für die es sich lohnt zu bezahlen.

10voto

Lie Ryan Punkte 57966

Manchmal, wenn ich eine bestimmte Methode erforschen möchte und der Aufruf von pdb einfach zu umständlich ist, würde ich hinzufügen:

import IPython; IPython.embed()

IPython.embed() startet eine IPython-Shell, die ab dem Zeitpunkt des Aufrufs Zugriff auf die lokalen Variablen hat.

0 Stimmen

Ich habe es mir zur Gewohnheit gemacht, dies am Anfang der Datei zu tun from IPython import embed und wenn ich dann schnell einen Haltepunkt in den Code einfügen möchte, schreibe ich embed() . Spart Zeit. Um nicht ewig in Schleifen festzustecken, mache ich embed();exit();

0 Stimmen

@MayankJaiswal: Ich hatte eine Tastenbelegung in Vim, um dieses Snippet (und ähnliche Snippets für pudb y debugger; in JavaScript) in die Datei, die ich gerade bearbeite. Wenn ich fertig bin, muss ich nur noch dd (ganze Zeile löschen), um den Haltepunkt zu entfernen. Dadurch wird das Risiko vermieden, die Debugger-Importzeile in die Versionskontrolle zu übertragen oder den Import zuerst am Anfang der Datei vorgeben zu müssen.

8voto

Hutch Punkte 9842

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. Der Autor sagt dies über wdb -

"Es gibt IDEs wie PyCharm, die ihre eigenen Debugger haben. Sie bieten einen ähnlichen oder gleichen Funktionsumfang ... Um sie zu nutzen, müssen Sie jedoch diese speziellen IDEs verwenden (und einige von ihnen sind nicht kostenlos oder nicht für alle Plattformen verfügbar). Wählen Sie das richtige Werkzeug für Ihre Bedürfnisse."

Ich dachte, ich gebe es einfach weiter.

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

Endlich Wenn Sie einen schönen grafischen Ausdruck Ihres Aufrufstapels in Django sehen möchten, schauen Sie sich das an: https://github.com/joerick/pyinstrument . Fügen Sie einfach pyinstrument.middleware.ProfilerMiddleware zu MIDDLEWARE_CLASSES hinzu und fügen Sie dann ?profile an das Ende der Anfrage-URL, um den Profiler zu aktivieren.

Sie können pyinstrument auch von der Kommandozeile oder durch Importieren als Modul ausführen.

0 Stimmen

PyCharm benutzt nur PyDev, nicht sein eigenes.

7voto

Jacinda Punkte 4612

Ich kann epdb (Extended Python Debugger) sehr empfehlen.

https://bitbucket.org/dugan/epdb

Eine Sache, die ich an epdb zum Debuggen von Django oder anderen Python-Webservern liebe, ist der Befehl epdb.serve(). Damit wird ein Trace gesetzt und an einen lokalen Port gesendet, mit dem Sie sich verbinden können. Typischer Anwendungsfall:

Ich habe eine Ansicht, die ich Schritt für Schritt durchgehen möchte. An der Stelle, an der ich den Trace setzen möchte, füge ich Folgendes ein.

import epdb; epdb.serve()

Sobald dieser Code ausgeführt wird, öffne ich einen Python-Interpreter und verbinde mich mit der Serving-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 vieles mehr, das Sie jederzeit über die epdb-Hilfe erfahren können.

Wenn Sie mehrere epdb-Instanzen gleichzeitig bedienen oder mit ihnen eine Verbindung herstellen wollen, können Sie den Port angeben, an dem Sie lauschen wollen (Standard ist 8080). D.h.

import epdb; epdb.serve(4242)

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

host ist standardmäßig 'localhost', wenn nicht angegeben. Ich habe es hier eingefügt, um zu demonstrieren, 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 der eingestellte Trace niemals auf Ihren Produktionsserver gelangt!

Als kurze Anmerkung: Sie können immer noch das Gleiche tun wie die akzeptierte Antwort mit epdb ( import epdb; epdb.set_trace() ), aber ich wollte die Aufschlagfunktion hervorheben, da ich sie so nützlich finde.

0 Stimmen

Epdb wird seit 2011 nicht mehr aktualisiert. Haben Sie jemals Probleme bei der Verwendung auf neueren Versionen von Django und/oder Python?

0 Stimmen

Ich habe nie in Probleme mit ihm gegen Python 2 (speziell 2.4-2.7) laufen. Ich habe es erst vor ein paar Tagen verwendet, in der Tat. Ich habe nie versucht, mit Python 3.

1 Stimmen

Ich verwende Django 1.8 auf Python 2.7 und ich kann epdb.connect nicht dazu bringen, mit epdb.serve zu sprechen. Ich erhalte einfach eine Zeitüberschreitung.

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