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!



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow