Django
Debuggen
Suche…
Bemerkungen
Pdb
Pdb kann auch alle vorhandenen Variablen im globalen oder lokalen Bereich globals()
, indem globals()
in die Eingabeaufforderung (Pdb) globals()
bzw. locals()
eingeben.
Python-Debugger verwenden (Pdb)
Das grundlegende Debugging-Tool für Django ist pdb , ein Teil der Python-Standardbibliothek.
Init View Skript
views.py
wir uns ein einfaches views.py
Skript an:
from django.http import HttpResponse
def index(request):
foo = 1
bar = 0
bug = foo/bar
return HttpResponse("%d goes here." % bug)
Konsolenbefehl zum Ausführen des Servers:
python manage.py runserver
Es ist offensichtlich, dass Django beim Laden der Indexseite einen ZeroDivisionError
Wenn wir jedoch vorgeben, dass der Fehler sehr tief im Code ZeroDivisionError
, könnte dies sehr böse werden.
Einen Haltepunkt setzen
Glücklicherweise können wir einen Haltepunkt setzen , um diesen Fehler aufzuspüren:
from django.http import HttpResponse
# Pdb import
import pdb
def index(request):
foo = 1
bar = 0
# This is our new breakpoint
pdb.set_trace()
bug = foo/bar
return HttpResponse("%d goes here." % bug)
Konsolenbefehl zum Ausführen des Servers mit pdb:
python -m pdb manage.py runserver
Jetzt wird der Haltepunkt für das Laden der Seite (Pdb) in der Shell ausgelöst, wodurch sich auch Ihr Browser im ausstehenden Zustand befindet.
Debuggen mit der PDB-Shell
Es ist Zeit, diese Ansicht zu debuggen, indem Sie über die Shell mit dem Skript interagieren:
> ../views.py(12)index()
-> bug = foo/bar
# input 'foo/bar' expression to see division results:
(Pdb) foo/bar
*** ZeroDivisionError: division by zero
# input variables names to check their values:
(Pdb) foo
1
(Pdb) bar
0
# 'bar' is a source of the problem, so if we set it's value > 0...
(Pdb) bar = 1
(Pdb) foo/bar
1.0
# exception gone, ask pdb to continue execution by typing 'c':
(Pdb) c
[03/Aug/2016 10:50:45] "GET / HTTP/1.1" 200 111
In der letzten Zeile sehen wir, dass unsere Ansicht eine OK
Antwort und eine Ausführung wie erwartet lieferte.
Um die pdb-Schleife zu stoppen, geben Sie einfach q
in eine Shell ein.
Verwenden der Django-Debug-Symbolleiste
Zuerst müssen Sie die django-debug-toolbar installieren:
pip install django-debug-toolbar
einstellungen.py :
Fügen Sie es als Nächstes zu den installierten Apps des Projekts hinzu. Seien Sie jedoch vorsichtig - es ist immer ratsam, eine andere Datei settings.py
für solche Entwicklungsanwendungen und Middlewares als Debug-Symbolleiste zu verwenden:
# If environment is dev...
DEBUG = True
INSTALLED_APPS += [
'debug_toolbar',
]
MIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware']
Die Debug-Symbolleiste stützt sich auch auf statische Dateien, daher sollte auch eine geeignete App enthalten sein:
INSTALLED_APPS = [
# ...
'django.contrib.staticfiles',
# ...
]
STATIC_URL = '/static/'
# If environment is dev...
DEBUG = True
INSTALLED_APPS += [
'debug_toolbar',
]
In einigen Fällen ist es auch erforderlich, INTERNAL_IPS
in settings.py
:
INTERNAL_IPS = ('127.0.0.1', )
urls.py :
In urls.py
, wie die offizielle Dokumentation vermuten lässt, das nächste Snippet das Routing der Debug-Symbolleiste aktivieren:
if settings.DEBUG and 'debug_toolbar' in settings.INSTALLED_APPS:
import debug_toolbar
urlpatterns += [
url(r'^__debug__/', include(debug_toolbar.urls)),
]
Statische Werkzeugleiste nach der Installation sammeln:
python manage.py collectstatic
Das heißt, die Debug-Symbolleiste wird auf den Seiten Ihres Projekts angezeigt und enthält verschiedene nützliche Informationen zur Ausführungszeit, SQL, statischen Dateien, Signalen usw.
HTML:
Für die django-debug-toolbar
Tags vom Typ content text/html
, <html>
und <body>
zum korrekten Rendern erforderlich.
Falls Sie sicher sind, dass Sie alles richtig konfiguriert haben, die Debug-Symbolleiste jedoch immer noch nicht dargestellt wird: Verwenden Sie diese "nukleare" Lösung , um herauszufinden, wie das funktioniert.
Verwenden von "Assert False"
Fügen Sie während der Entwicklung die folgende Zeile in Ihren Code ein:
assert False, value
bewirkt, dass django einen AssertionError
mit dem als Fehlermeldung gelieferten Wert ausgibt, wenn diese Zeile ausgeführt wird.
Wenn dies in einer Ansicht oder in einem von einer Sicht aufgerufenen Code auftritt und DEBUG=True
ist, wird ein vollständiger und detaillierter Stacktrace mit vielen Debugging-Informationen im Browser angezeigt.
Vergessen Sie nicht, die Leine zu entfernen, wenn Sie fertig sind!
Erwägen Sie, mehr Dokumentation, Tests, Protokolle und Assertionen zu schreiben, anstatt einen Debugger zu verwenden
Das Debuggen erfordert Zeit und Mühe.
Anstatt Fehler mit einem Debugger zu jagen, sollten Sie mehr Zeit für die Verbesserung Ihres Codes aufwenden, indem Sie:
- Schreiben Sie Tests und führen Sie sie aus. Python und Django verfügen über hervorragende Testframeworks, mit denen Sie Code viel schneller testen können als manuell mit einem Debugger.
- Verfassen von Dokumentation für Ihre Funktionen, Klassen und Module. PEP 257 und der Python Style Guide von Google enthalten bewährte Methoden zum Schreiben guter Dokumentstrings.
- Verwenden Sie die Protokollierung , um Ausgaben aus Ihrem Programm zu erzeugen - während der Entwicklung und nach der Bereitstellung.
- In
assert
Ionen , um Ihren Code in wichtigen Orten: Reduzieren Mehrdeutigkeit, fangen Probleme , wie sie erstellt werden.
Bonus: Schreiben Sie Doktests zum Kombinieren von Dokumentation und Testen!