Ricerca…


Osservazioni

PDB

Pdb può anche stampare tutte le variabili esistenti in ambito globale o locale, digitando rispettivamente globals() o locals() in (Pdb) prompt.

Utilizzo di Python Debugger (Pdb)

La maggior parte degli strumenti di debug di Django di base è pdb , una parte della libreria standard di Python.

Script di visualizzazione iniziale

Esaminiamo un semplice script views.py :

from django.http import HttpResponse


def index(request):
    foo = 1
    bar = 0

    bug = foo/bar

    return HttpResponse("%d goes here." % bug)

Comando della console per eseguire il server:

python manage.py runserver

È ovvio che Django genererebbe un ZeroDivisionError quando ZeroDivisionError a caricare la pagina indice, ma se fingiamo che il bug sia molto profondo nel codice, potrebbe diventare davvero sgradevole.

Impostazione di un punto di interruzione

Fortunatamente, possiamo impostare un breakpoint per rintracciare quel bug:

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)

Comando della console per eseguire il server con pdb:

python -m pdb manage.py runserver

Ora sulla pagina il punto di interruzione del carico si attiverà (Pdb) nella shell, che bloccherà anche il browser in sospeso.

Debugging con shell pdb

È tempo di eseguire il debug di questa vista interagendo con lo script tramite 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

Nell'ultima riga vediamo che la nostra vista ha restituito una risposta OK e l'esecuzione come dovrebbe.

Per interrompere il ciclo pdb, basta inserire q in una shell.

Utilizzando la barra degli strumenti Debug di Django

Innanzitutto, è necessario installare django-debug-toolbar :

pip install django-debug-toolbar

settings.py :

Successivamente, includilo nelle app installate del progetto, ma fai attenzione: è sempre buona norma utilizzare un diverso file settings.py per tali app e middleware di solo sviluppo come barra degli strumenti di debug:

# If environment is dev...
DEBUG = True

INSTALLED_APPS += [
    'debug_toolbar',
]

MIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware']

La barra degli strumenti di debug si basa anche su file statici, quindi dovrebbe essere inclusa anche l'app appropriata:

INSTALLED_APPS = [
    # ...
    'django.contrib.staticfiles',
    # ...
]

STATIC_URL = '/static/'

# If environment is dev...
DEBUG = True

INSTALLED_APPS += [
    'debug_toolbar',
]

In alcuni casi, è anche necessario impostare INTERNAL_IPS in settings.py :

INTERNAL_IPS = ('127.0.0.1', )

urls.py :

In urls.py , come suggerisce la documentazione ufficiale, il successivo snippet dovrebbe abilitare il routing della barra degli strumenti di debug:

if settings.DEBUG and 'debug_toolbar' in settings.INSTALLED_APPS:
    import debug_toolbar
    urlpatterns += [
        url(r'^__debug__/', include(debug_toolbar.urls)),
    ]

Raccogli statico della barra degli strumenti dopo l'installazione:

python manage.py collectstatic

Ecco fatto, la barra degli strumenti di debug comparirà sulle pagine del tuo progetto, fornendo varie informazioni utili sui tempi di esecuzione, SQL, file statici, segnali, ecc.

HTML:

Inoltre, django-debug-toolbar richiede un tipo di contenuto di tag text/html , <html> e <body> per renderizzare correttamente.


Nel caso in cui sei sicuro di aver configurato tutto correttamente, ma la barra degli strumenti di debug non viene ancora renderizzata: usa questa soluzione "nucleare" per cercare di capirlo.

Usare "asserire False"

Durante lo sviluppo, inserisci la seguente riga nel tuo codice:

assert False, value

farà sì che django sollevi AssertionError con il valore fornito come messaggio di errore quando viene eseguita questa riga.

Se questo si verifica in una vista, o in qualsiasi codice chiamato da una vista, e DEBUG=True è impostato, nel browser verrà visualizzato uno stacktrace completo e dettagliato con molte informazioni di debug.

Non dimenticare di rimuovere la linea quando hai finito!

Considera di scrivere più documenti, test, log e asserzioni invece di usare un debugger

Il debug richiede tempo e fatica.

Invece di inseguire i bug con un debugger, considera di dedicare più tempo a migliorare il tuo codice:

  • Scrivi ed esegui i test . Python e Django dispongono di ottimi framework di test integrati, che possono essere utilizzati per testare il codice molto più rapidamente rispetto a un debugger manuale.
  • Scrivere una documentazione adeguata per funzioni, classi e moduli. PEP 257 e Google's Python Style Guide forniscono buone pratiche per la scrittura di buone docstring.
  • Usa la registrazione per produrre l'output dal tuo programma - durante lo sviluppo e dopo la distribuzione.
  • Aggiungi assert ioni al tuo codice in posti importanti: riduce l'ambiguità, cattura i problemi man mano che vengono creati.

Bonus: scrivi doctest per combinare documentazione e test!



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow