Also fing ich an, in Python und später in Django das Codieren zu lernen . Das erste Mal war es schwierig, Rückverfolgungen zu betrachten und tatsächlich herauszufinden, was ich falsch gemacht habe und wo der Syntaxfehler war. Einige Zeit ist vergangen und irgendwann habe ich eine Routine beim Debuggen meines Django-Codes. Da dies zu Beginn meiner Codierungserfahrung gemacht wurde, setzte ich mich hin und fragte mich, ob meine Vorgehensweise ineffektiv war und schneller durchgeführt werden konnte. Normalerweise schaffe ich es, die Fehler in meinem Code zu finden und zu korrigieren, aber ich frage mich, ob ich es schneller machen sollte.
Normalerweise verwende ich nur die Debug-Informationen, die Django gibt, wenn sie aktiviert sind. Wenn die Dinge so enden, wie ich es mir vorgestellt habe, unterbreche ich den Code-Fluss häufig mit einem Syntaxfehler 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 einige gute Tools oder bessere Möglichkeiten, um Ihren Django-Code zu debuggen?
Antworten:
Es gibt eine Reihe von Möglichkeiten, aber am einfachsten ist es, einfach den Python-Debugger zu verwenden . Fügen Sie einer Django-Ansichtsfunktion einfach die folgende Zeile hinzu:
oder
Wenn Sie versuchen, diese Seite in Ihren Browser zu laden, bleibt der Browser hängen und Sie werden aufgefordert, das Debuggen des tatsächlich ausgeführten Codes fortzusetzen.
Es gibt jedoch andere Optionen (ich empfehle sie nicht):
Der Python-Debugger (pdb) wird jedoch für alle Arten von Python-Code dringend empfohlen. Wenn Sie bereits mit pdb beschäftigt sind, sollten Sie sich auch IPDB ansehen , die ipython zum Debuggen verwendet.
Einige weitere nützliche Erweiterungen für pdb sind
pdb ++ , vorgeschlagen von Antash .
pudb , vorgeschlagen von PatDuJour .
Verwendung des Python-Debuggers in Django , vorgeschlagen von Seafangs .
quelle
manage.py runserver --pdb
undmanage.py test --pdb
Befehle.ipython
auch.Ipdb
, die mitgeliefert wirdipython
, bietet Tab-Vervollständigung, farbige Syntax und mehr :-).Ich mag den interaktiven Debugger von Werkzeug sehr . Es ä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 einen
runserver_plus
Verwaltungsbefehl, der den Entwicklungsserver startet und Ihnen den Tool- Debugger für Ausnahmen gibt.Natürlich sollten Sie dies nur lokal ausführen, da es jedem mit einem Browser die Rechte gibt, beliebigen Python-Code im Kontext des Servers auszuführen.
quelle
python 3.3
Ein kleiner Quickie für Template-Tags:
Jetzt können Sie in einer Vorlage
{{ template_var|pdb }}
eine PDF-Sitzung durchführen (vorausgesetzt, Sie führen den lokalen Entwicklungsserver aus), in der Sieelement
nach Herzenslust nachsehen können .Auf diese Weise können Sie sehen, was mit Ihrem Objekt passiert ist, wenn es bei der Vorlage ankommt.
quelle
Es gibt einige Tools, die gut zusammenarbeiten und Ihre Debugging-Aufgabe erleichtern können.
Am wichtigsten ist die Django-Debug-Symbolleiste .
Dann benötigen Sie eine gute Protokollierung mit der Python- Protokollierungsfunktion . Sie können die Protokollausgabe an eine Protokolldatei senden. Eine einfachere Option ist jedoch das Senden der Protokollausgabe an Firepython . Um dies zu verwenden, müssen Sie den Firefox-Browser mit der Firebug- Erweiterung verwenden. Firepython enthält ein Firebug-Plugin, das alle serverseitigen Protokollierungen auf einer Firebug-Registerkarte anzeigt.
Firebug selbst ist auch wichtig für das Debuggen der Javascript-Seite jeder von Ihnen entwickelten App. (Vorausgesetzt, Sie haben natürlich JS-Code).
Ich mochte auch Django-Viewtools zum interaktiven Debuggen von Ansichten mit pdb, aber ich benutze es nicht so oft.
Es gibt nützlichere Tools wie Dozer zum Aufspüren von Speicherlecks (es gibt auch andere gute Vorschläge in den Antworten hier auf SO für das Aufspüren von Speicher).
quelle
Ich benutze PyCharm (dieselbe Pydev-Engine wie Eclipse). Hilft mir wirklich, visuell in der Lage zu sein, meinen Code zu durchlaufen und zu sehen, was passiert.
quelle
Fast alles wurde bisher erwähnt, so dass ich nur dass statt hinzufügen würde
pdb.set_trace()
man verwenden ipdb.set_trace () , die ipython verwendet und daher ist mächtiger ( die automatische Vervollständigung und andere Leckereien). Dies erfordert ein ipdb-Paket, das Sie also nur benötigenpip install ipdb
quelle
Ich habe
django-pdb
zu PyPI geschoben . Es ist eine einfache App, die bedeutet, dass Sie Ihren Quellcode nicht jedes Mal bearbeiten müssen, wenn Sie in pdb einbrechen möchten.Die Installation ist nur ...
pip install django-pdb
'django_pdb'
Ihrem hinzuINSTALLED_APPS
Sie können jetzt ausführen:
manage.py runserver --pdb
zu Beginn jeder Ansicht in pdb einbrechen ...Und führen Sie aus:
manage.py test --pdb
um bei Testfehlern / -fehlern in pdb einzubrechen ...Das Projekt wird auf GitHub gehostet , Beiträge sind natürlich willkommen.
quelle
Der einfachste Weg, Python zu debuggen - insbesondere für Programmierer, die an Visual Studio gewöhnt sind - ist die Verwendung von PTVS (Python Tools for Visual Studio). Die Schritte sind einfach:
Wenn Sie Django mit PTVS debuggen möchten, müssen Sie Folgendes tun:
quelle
Ich benutze pyDev mit Eclipse wirklich gut, setze Haltepunkte , gehe in den Code, zeige Werte für Objekte und Variablen an und probiere es aus.
quelle
Ich benutze PyCharm und stehe den ganzen Weg dazu. Es hat mich ein wenig gekostet, aber ich muss sagen, dass der Vorteil, den ich daraus ziehe, von unschätzbarem Wert ist. Ich habe versucht, über die Konsole zu debuggen, und ich gebe den Leuten viel Anerkennung dafür, wer das kann, aber für mich ist es großartig, meine Anwendung (en) visuell zu debuggen.
Ich muss allerdings sagen, PyCharm viel Speicher benötigt. Andererseits ist nichts Gutes im Leben frei. Sie kamen gerade mit ihrer neuesten Version 3. Sie funktioniert 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 verwenden, würde ich empfehlen, die Testversion 30 Tage lang zu erwerben, um einen Blick auf die Leistungsfähigkeit von PyCharm zu werfen. Ich bin sicher, dass es auch andere Tools gibt, wie zum Beispiel Aptana. Aber ich denke, ich mag auch das Aussehen von PyCharm. Ich fühle mich sehr wohl, wenn ich meine Apps dort debugge.
quelle
Manchmal, wenn ich mich mit einer bestimmten Methode beschäftigen möchte und das Beschwören von PDFs einfach zu umständlich ist, würde ich hinzufügen:
IPython.embed()
Startet eine IPython-Shell, die ab dem Punkt, an dem Sie sie aufrufen, Zugriff auf die lokalen Variablen hat.quelle
from IPython import embed
und wenn ich dann schnell einen Haltepunkt in den Code einfügen möchte, schreibe ichembed()
. Spart Zeit. Um zu vermeiden, dass ich für immer in Schleifen stecke, tue ich dasembed();exit();
pudb
unddebugger;
in JavaScript) in die Datei einzufügen, die ich bearbeite. Nachdem ich fertig bin,dd
lösche ich einfach (ganze Zeile löschen) den Haltepunkt. Dadurch wird das Risiko vermieden, dass die Debugger-Importzeile in die Versionskontrolle übernommen wird oder der Import zuerst oben in der Datei voreingestellt werden muss.Aus meiner Sicht könnten wir allgemeine Code-Debugging- Aufgaben in drei verschiedene Verwendungsmuster unterteilen:
assert False
die Stelle ein, an der Sie anhalten möchten.import pudb; pudb.set_trace()
. Der Hauptvorteil gegenüber [i] pdb ist, dass PuDB (während Sie wie in den 80ern aussehen) das Festlegen von benutzerdefinierten Uhrenausdrücken zum Kinderspiel macht. Das Debuggen einer Reihe verschachtelter Schleifen ist mit einer GUI viel einfacher.Ach ja, die Probleme 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 die Debug-Symbolleiste verwenden , überprüfen Sie einfach den Kontext im Abschnitt "Vorlagen" oder setzen Sie, falls dies nicht ausreicht, eine Unterbrechung im Code Ihrer Ansichten, sobald Ihr Kontext gefüllt ist.
So geht es.
quelle
import pudb;pu.db
Ich kann epdb (Extended Python Debugger) nur 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 (). Dadurch wird eine Ablaufverfolgung festgelegt und an einem lokalen Port bereitgestellt, zu dem Sie eine Verbindung herstellen können. Typischer Anwendungsfall:
Ich habe die Ansicht, dass ich Schritt für Schritt durchgehen möchte. Ich werde an der Stelle, an der ich die Ablaufverfolgung festlegen möchte, Folgendes einfügen.
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. durchlaufen.
Und jede Menge mehr, die Sie jederzeit über das Schreiben von epdb-Hilfe lernen können.
Wenn Sie mehrere epdb-Instanzen gleichzeitig bedienen oder eine Verbindung herstellen möchten, können Sie den Port angeben, der überwacht werden soll (Standard ist 8080). Dh
Der Host ist standardmäßig 'localhost', falls nicht angegeben. Ich habe es hier reingeworfen, um zu demonstrieren, wie Sie damit etwas anderes als eine lokale Instanz wie einen Entwicklungsserver in Ihrem lokalen LAN debuggen können. Wenn Sie dies tun, achten Sie natürlich darauf, dass der festgelegte Trace niemals auf Ihren Produktionsserver gelangt!
Kurz gesagt, Sie können immer noch das Gleiche tun wie die akzeptierte Antwort mit epdb (
import epdb; epdb.set_trace()
), aber ich wollte die Serve-Funktionalität hervorheben, da ich sie so nützlich fand.quelle
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 allen Schnickschnack. Autor sagt dies über wdb -
"Es gibt IDEs wie PyCharm, die über eigene Debugger verfügen. Sie bieten ähnliche oder gleiche Funktionen ... Um sie jedoch verwenden zu können, müssen Sie diese spezifischen IDEs verwenden (und einige davon sind nicht kostenlos oder möglicherweise nicht für alle verfügbar Plattformen). Wählen Sie das richtige Werkzeug für Ihre Bedürfnisse. "
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 möchten einen schönen graphischen Ausdruck Ihrer Call - Stack in Django, Kasse sehen: 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 über die Befehlszeile oder durch Importieren als Modul ausführen.
quelle
Fügen Sie in der entsprechenden Zeile des Python-Codes
import pdb; pdb.set_trace()
oderbreakpoint()
(form python3.7) hinzu und führen Sie es aus. Die Ausführung wird mit einer interaktiven Shell beendet. In der Shell können Sie Python-Code ausführen (dh Variablen drucken) oder Befehle verwenden wie:c
Ausführung fortsetzenn
Schritt zur nächsten Zeile innerhalb derselben Funktions
Schritt zur nächsten Zeile in dieser Funktion oder einer aufgerufenen Funktionq
Beenden Sie den Debugger / die AusführungSiehe auch: https://poweruser.blog/setting-a-breakpoint-in-python-438e23fe6b28
quelle
Eine Ihrer besten Optionen zum Debuggen von Django-Code ist über wdb: https://github.com/Kozea/wdb
Installieren Sie den Server, führen Sie ihn aus und fügen Sie in Ihrem Code Folgendes hinzu:
Nach Angaben des Autors sind die Hauptunterschiede in Bezug auf
pdb
:Es hat eine großartige browserbasierte Benutzeroberfläche. Eine Freude zu benutzen! :) :)
quelle
Ich benutze PyCharm und verschiedene Debug-Tools. Haben Sie auch einen schönen Artikel über das einfache Einrichten dieser Dinge für Anfänger. Sie können hier beginnen. Es wird allgemein über das Debuggen von PDB und GUI bei Django-Projekten berichtet. Hoffe, jemand würde von ihnen profitieren.
quelle
Wenn Sie Aptana für die Django-Entwicklung verwenden, beachten Sie Folgendes: http://www.youtube.com/watch?v=qQh-UQFltJQ
Wenn nicht, sollten Sie es verwenden.
quelle
Die meisten Optionen werden bereits erwähnt. Um den Vorlagenkontext zu drucken, habe ich dafür eine einfache Bibliothek erstellt. Siehe https://github.com/edoburu/django-debugtools
Sie können damit den Vorlagenkontext ohne
{% load %}
Konstrukt drucken :Es verwendet ein benutzerdefiniertes Druckformat, um die Variablen in einem
<pre>
Tag anzuzeigen .quelle
Ich finde, Visual Studio Code eignet sich hervorragend zum Debuggen von Django-Apps. Die Standardparameter von python launch.json werden
python manage.py
mit dem angehängten Debugger ausgeführt, sodass Sie Haltepunkte festlegen und Ihren Code nach Belieben durchlaufen können.quelle
Für diejenigen, die versehentlich pdb zu Live-Commits hinzufügen können, kann ich diese Erweiterung der # Koobz-Antwort vorschlagen:
quelle
Aus eigener Erfahrung gibt es zwei Möglichkeiten:
Verwenden Sie ipdb , ein erweiterter Debugger, der pdb mag.
import ipdb;ipdb.set_trace()
oderbreakpoint()
(aus Python3.7)Verwenden Sie die Django-Shell. Verwenden Sie einfach den folgenden Befehl. Dies ist sehr hilfreich, wenn Sie eine neue Ansicht entwickeln.
python manage.py shell
quelle
Ich empfehle dringend, PDB zu verwenden.
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 , um alle Arten von Anfragen, Antworten und Treffern für die Datenbank zu überprüfen
quelle
Wie in anderen Beiträgen hier erwähnt, ist das Festlegen von Haltepunkten in Ihrem Code und das Durchlaufen des Codes, um festzustellen, ob er sich wie erwartet 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 wie sich Ihr Code verhält macht.
Dazu würde ich die Verwendung von WingIde empfehlen. Genau wie andere erwähnte IDEs sind sie einfach und benutzerfreundlich, haben ein ansprechendes Layout und auch einfach zu setzende Haltepunkte. Bewerten / Ändern des Stapels usw. Perfekt, um zu visualisieren, was Ihr Code tut, wenn Sie ihn durchlaufen. Ich bin ein großer Fan davon.
Außerdem verwende ich 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-Symbolleiste unerlässlich - https://github.com/django-debug-toolbar/django-debug-toolbar
Und obwohl dies kein explizites Debug- oder Analysetool ist, ist einer meiner Favoriten die SQL Printing Middleware, die von Django Snippets unter https://djangosnippets.org/snippets/290/ erhältlich ist.
Dadurch werden die von Ihrer Ansicht generierten SQL-Abfragen angezeigt. Dies gibt Ihnen einen guten Überblick darüber, was der ORM tut und ob Ihre Abfragen effizient sind oder Sie Ihren Code überarbeiten müssen (oder Caching hinzufügen müssen).
Ich finde es von unschätzbarem Wert, die Abfrageleistung beim Entwickeln und Debuggen meiner Anwendung im Auge zu behalten.
Nur ein weiterer Tipp: Ich habe es für meinen eigenen Gebrauch leicht modifiziert, um nur die Zusammenfassung und nicht die SQL-Anweisung anzuzeigen. Deshalb verwende ich es 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 dann feststelle, dass etwas Schlimmes passiert (aus Sicht der Leistung oder der Anzahl der Abfragen), schalte ich die vollständige Anzeige der SQL-Anweisungen wieder ein, um genau zu sehen, was gerade passiert. Sehr praktisch, wenn Sie an einem großen Django-Projekt mit mehreren Entwicklern arbeiten.
quelle
benutze
pdb
oderipdb
. Der Unterschied zwischen diesen beiden ist, dass ipdb die automatische Vervollständigung unterstützt.für pdb
für ipdb
Zum Ausführen einer neuen
n
Zeilentaste, zum Fortfahren der Treffer-c
Taste. Überprüfen Sie weitere Optionen mithelp(pdb)
quelle
Ein zusätzlicher Vorschlag.
Sie können Nosetests und PDF zusammen nutzen, anstatt
pdb.set_trace()
Ihre Ansichten manuell einzufügen . Der Vorteil ist, dass Sie Fehlerbedingungen beim ersten Start beobachten können, möglicherweise im Code von Drittanbietern.Hier ist ein Fehler für mich heute.
Jetzt weiß ich, dass dies bedeutet, dass ich den Konstruktor für das Formular vermasselt habe, und ich habe sogar eine gute Vorstellung davon, welches Feld ein Problem ist. Aber kann ich pdb verwenden, um zu sehen, worüber sich knusprige Formen innerhalb einer Vorlage beschweren ?
Ja, ich kann. Mit Hilfe der --pdb Option auf nosetests:
tests$ nosetests test_urls_catalog.py --pdb
Sobald ich auf eine Ausnahme stoße (einschließlich solcher, die ordnungsgemäß behandelt wurden), stoppt pdb dort, wo es passiert, und ich kann mich umschauen.
Nun ist es klar, dass mein Auswahlargument für den knusprigen Feldkonstruktor darin bestand, dass es sich um eine Liste innerhalb einer Liste handelte und nicht um eine Liste / ein Tupel von Tupeln.
Das Schöne ist, dass diese PDF-Datei im Code von crispy stattfindet, nicht in meinem, und ich musste sie nicht manuell einfügen.
quelle
Während der Entwicklung schnell hinzufügen
kann helfen, Probleme in Ansichten oder anderswo zu diagnostizieren, ohne dass ein Debugger verwendet werden muss.
quelle