Django
Debugowanie
Szukaj…
Uwagi
Pdb
Pdb może również wydrukować wszystkie istniejące zmienne w zakresie globalnym lub lokalnym, wpisując odpowiednio globals()
lub locals()
w pytaniu (Pdb).
Korzystanie z Python Debugger (Pdb)
Najbardziej podstawowym narzędziem do debugowania w Django jest pdb , część standardowej biblioteki Pythona.
Skrypt widoku początkowego
Przeanalizujmy prosty skrypt views.py
:
from django.http import HttpResponse
def index(request):
foo = 1
bar = 0
bug = foo/bar
return HttpResponse("%d goes here." % bug)
Polecenie konsoli do uruchomienia serwera:
python manage.py runserver
Oczywiste jest, że Django rzuci błąd ZeroDivisionError
podczas próby załadowania strony indeksu, ale jeśli będziemy udawać, że błąd jest bardzo głęboko w kodzie, może być naprawdę paskudny.
Ustalanie punktu przerwania
Na szczęście możemy ustawić punkt przerwania w celu wyśledzenia tego błędu:
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)
Polecenie konsoli do uruchomienia serwera z pdb:
python -m pdb manage.py runserver
Teraz punkt przerwania ładowania strony wywoła (Pdb) monit w powłoce, który również zawiesi przeglądarkę w stanie oczekiwania.
Debugowanie za pomocą powłoki pdb
Czas na debugowanie tego widoku poprzez interakcję ze skryptem za pomocą powłoki:
> ../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
W ostatnim wierszu widzimy, że nasz widok zwrócił odpowiedź OK
i wykonał się tak, jak powinien.
Aby zatrzymać pętlę pdb, po prostu wprowadź q
w powłoce.
Korzystanie z paska narzędzi debugowania Django
Najpierw musisz zainstalować pasek narzędzi django-debug-tool :
pip install django-debug-toolbar
settings.py :
Następnie dołącz go do zainstalowanych aplikacji projektu, ale bądź ostrożny - zawsze dobrą praktyką jest używanie innego pliku settings.py
dla takich aplikacji tylko dla programistów i oprogramowania pośredniego, takich jak pasek narzędzi debugowania:
# If environment is dev...
DEBUG = True
INSTALLED_APPS += [
'debug_toolbar',
]
MIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware']
Pasek narzędzi debugowania opiera się również na plikach statycznych, dlatego też należy dołączyć odpowiednią aplikację:
INSTALLED_APPS = [
# ...
'django.contrib.staticfiles',
# ...
]
STATIC_URL = '/static/'
# If environment is dev...
DEBUG = True
INSTALLED_APPS += [
'debug_toolbar',
]
W niektórych przypadkach wymagane jest również ustawienie INTERNAL_IPS
w settings.py
:
INTERNAL_IPS = ('127.0.0.1', )
urls.py :
W urls.py
, jak sugeruje oficjalna dokumentacja, następny fragment powinien włączyć routing paska narzędzi debugowania:
if settings.DEBUG and 'debug_toolbar' in settings.INSTALLED_APPS:
import debug_toolbar
urlpatterns += [
url(r'^__debug__/', include(debug_toolbar.urls)),
]
Zbierz statyczne pasek narzędzi po instalacji:
python manage.py collectstatic
To wszystko, pasek narzędzi debugowania pojawi się na stronach twojego projektu, dostarczając różnych przydatnych informacji o czasie wykonania, SQL, plikach statycznych, sygnałach itp.
HTML:
Ponadto django-debug-toolbar
wymaga typu zawartości tagów text/html
, <html>
i <body>
do poprawnego renderowania.
Jeśli masz pewność, że wszystko skonfigurowałeś poprawnie, ale pasek narzędzi do debugowania nadal nie jest renderowany: użyj tego „nuklearnego” rozwiązania, aby spróbować to rozwiązać.
Używanie „aser False”
Podczas opracowywania wstawiam do kodu następujący wiersz:
assert False, value
spowoduje, że django zgłosi błąd AssertionError
o wartości podanej jako komunikat o błędzie podczas wykonywania tego wiersza.
Jeśli dzieje się tak w widoku lub w dowolnym kodzie wywoływanym z widoku, a ustawiona jest opcja DEBUG=True
, w przeglądarce zostanie wyświetlony pełny i szczegółowy ślad stosu z dużą ilością informacji debugowania.
Nie zapomnij usunąć linii, gdy skończysz!
Rozważ napisanie większej ilości dokumentacji, testów, rejestrowania i asercji zamiast używania debuggera
Debugowanie wymaga czasu i wysiłku.
Zamiast ścigać błędy za pomocą debugera, warto poświęcić więcej czasu na ulepszenie kodu poprzez:
- Napisz i uruchom testy . Python i Django mają świetne wbudowane ramy testowe - których można używać do testowania kodu znacznie szybciej niż ręcznie za pomocą debuggera.
- Pisanie odpowiedniej dokumentacji dla twoich funkcji, klas i modułów. PEP 257 i przewodnik po języku Python w stylu Google zapewniają dobre praktyki pisania dobrych dokumentów.
- Użyj funkcji Rejestrowanie, aby wygenerować dane wyjściowe z programu - podczas programowania i po wdrożeniu.
- Dodaj jony
assert
do swojego kodu w ważnych miejscach: Zmniejsz dwuznaczność, wychwytuj problemy podczas ich tworzenia.
Premia: Napisz dokumenty do połączenia dokumentacji i testów!