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!



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow