Django
Debugging
Zoeken…
Opmerkingen
pdb
Pdb kan ook alle bestaande variabelen in globaal of lokaal bereik afdrukken, door respectievelijk globals()
of locals()
in (Pdb) prompt te typen.
Python Debugger (Pdb) gebruiken
Het meest elementaire hulpprogramma voor het opsporen van fouten in Django is pdb , een onderdeel van de standaardbibliotheek van Python.
Init view script
Laten we een eenvoudig views.py
script bekijken:
from django.http import HttpResponse
def index(request):
foo = 1
bar = 0
bug = foo/bar
return HttpResponse("%d goes here." % bug)
Console-opdracht om server uit te voeren:
python manage.py runserver
Het is duidelijk dat Django een ZeroDivisionError
zou gooien wanneer je probeert de indexpagina te laden, maar als we doen alsof de bug erg diep in de code zit, kan het echt smerig worden.
Een breekpunt instellen
Gelukkig kunnen we een breekpunt instellen om die bug op te sporen:
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)
Console-opdracht om server uit te voeren met pdb:
python -m pdb manage.py runserver
Nu op de pagina laad het breekpunt de prompt (Pdb) in de shell, die ook uw browser in hangende staat zal hangen.
Debuggen met pdb-shell
Het is tijd om die weergave te debuggen door interactie met het script via shell:
> ../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 de laatste regel zien we dat onze weergave een OK
antwoord heeft geretourneerd en naar behoren heeft uitgevoerd.
Om de pdb-lus te stoppen, voert u gewoon q
in een shell in.
De Django Debug-werkbalk gebruiken
Eerst moet u de django-debug-toolbar installeren:
pip install django-debug-toolbar
settings.py :
Voeg het vervolgens toe aan de geïnstalleerde apps van het project, maar wees voorzichtig - het is altijd een goede gewoonte om een ander bestand settings.py
te gebruiken voor dergelijke apps met alleen ontwikkeling en middlewares als foutopsporingswerkbalk:
# If environment is dev...
DEBUG = True
INSTALLED_APPS += [
'debug_toolbar',
]
MIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware']
De foutopsporingswerkbalk is ook afhankelijk van statische bestanden, dus de juiste app moet ook worden opgenomen:
INSTALLED_APPS = [
# ...
'django.contrib.staticfiles',
# ...
]
STATIC_URL = '/static/'
# If environment is dev...
DEBUG = True
INSTALLED_APPS += [
'debug_toolbar',
]
In sommige gevallen is het ook vereist om INTERNAL_IPS
in te stellen in settings.py
:
INTERNAL_IPS = ('127.0.0.1', )
urls.py :
In urls.py
, zoals officiële documentatie suggereert, moet het volgende fragment debug-werkbalkroutering inschakelen:
if settings.DEBUG and 'debug_toolbar' in settings.INSTALLED_APPS:
import debug_toolbar
urlpatterns += [
url(r'^__debug__/', include(debug_toolbar.urls)),
]
Verzamel statische werkbalk na installatie:
python manage.py collectstatic
Dat is alles, de werkbalk voor foutopsporing verschijnt op de pagina's van uw project en biedt verschillende nuttige informatie over de uitvoeringstijd, SQL, statische bestanden, signalen, enz.
HTML:
Ook heeft de django-debug-toolbar
een Content-type text/html
, <html>
en <body>
tags nodig om correct te kunnen worden weergegeven.
Als u zeker weet dat u alles goed hebt geconfigureerd, maar de foutopsporingswerkbalk nog steeds niet wordt weergegeven: gebruik deze "nucleaire" oplossing om te proberen erachter te komen.
"Assert False" gebruiken
Voeg tijdens het ontwikkelen de volgende regel toe aan uw code:
assert False, value
zorgt ervoor dat django een AssertionError
met de AssertionError
waarde als foutbericht wanneer deze regel wordt uitgevoerd.
Als dit gebeurt in een weergave of in een code die vanuit een weergave wordt aangeroepen en DEBUG=True
is ingesteld, wordt een volledige en gedetailleerde stacktrace met veel foutopsporingsinformatie weergegeven in de browser.
Vergeet niet om de regel te verwijderen wanneer u klaar bent!
Overweeg om meer documentatie, tests, logboekregistraties en beweringen te schrijven in plaats van een foutopsporing te gebruiken
Debuggen kost tijd en moeite.
Overweeg in plaats van bugs met een debugger op te jagen, meer tijd te besteden aan het verbeteren van uw code door:
- Tests schrijven en uitvoeren. Python en Django hebben geweldige ingebouwde testkaders - die kunnen worden gebruikt om uw code veel sneller te testen dan handmatig met een debugger.
- Geschikte documentatie schrijven voor uw functies, klassen en modules. PEP 257 en de Python Style Guide van Google bieden goede werkwijzen voor het schrijven van goede docstrings.
- Gebruik logboekregistratie om uitvoer van uw programma te produceren - tijdens de ontwikkeling en na de implementatie.
- Voeg op belangrijke plaatsen
assert
aan uw code toe: verminder dubbelzinnigheid, vang problemen op terwijl ze worden gemaakt.
Bonus: schrijf doctests voor het combineren van documentatie en testen!