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!



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow