Zacząłem więc uczyć się programowania w Pythonie, a później w Django . Za pierwszym razem ciężko było spojrzeć na trackbacki i właściwie dowiedzieć się, co zrobiłem źle i gdzie był błąd składniowy. Minęło już trochę czasu i po drodze, chyba mam rutynę w debugowaniu mojego kodu Django. Ponieważ zostało to zrobione na wczesnym etapie programowania, usiadłem i zastanawiałem się, czy to, co robię, jest nieskuteczne i czy można to zrobić szybciej. Zwykle udaje mi się znaleźć i poprawić błędy w moim kodzie, ale zastanawiam się, czy powinienem to robić szybciej?
Zwykle używam informacji debugowania, które Django podaje, gdy są włączone. Kiedy rzeczy kończą się tak, jak myślałem, często przerywam przepływ kodu z błędem składniowym i patrzę na zmienne w tym punkcie przepływu, aby dowiedzieć się, gdzie kod robi coś innego niż chciałem.
Ale czy można to poprawić? Czy są jakieś dobre narzędzia lub lepsze sposoby debugowania kodu Django?
Odpowiedzi:
Istnieje wiele sposobów, aby to zrobić, ale najprostszym jest po prostu użycie debugera w języku Python . Wystarczy dodać następujący wiersz do funkcji widoku Django:
lub
Jeśli spróbujesz załadować tę stronę w przeglądarce, przeglądarka się zawiesi i pojawi się monit o kontynuowanie debugowania rzeczywistego kodu wykonawczego.
Istnieją jednak inne opcje (nie polecam ich):
Ale Python Debugger (pdb) jest wysoce zalecany dla wszystkich typów kodu Python. Jeśli jesteś już w pdb, powinieneś także zajrzeć na IPDB, który używa ipython do debugowania.
Niektóre bardziej przydatne rozszerzenia pdb są
pdb ++ , sugerowany przez Antash .
pudb , sugerowany przez PatDuJour .
Korzystanie z debugera Python w Django , sugerowanego przez Seafangs .
źródło
manage.py runserver --pdb
imanage.py test --pdb
rozkazuje.ipython
również.Ipdb
, który jest dostarczanyipython
, zawiera funkcje uzupełniania tabulatorów, kolorową składnię i wiele więcej :-).Naprawdę lubię interaktywny debugger Werkzeug . Jest podobny do strony debugowania Django, z tym wyjątkiem, że otrzymujesz interaktywną powłokę na każdym poziomie śledzenia. Jeśli używasz rozszerzeń django , otrzymujesz
runserver_plus
polecenie zarządzania, które uruchamia serwer programistyczny i daje ci debuger Werkzeug na wyjątkach.Oczywiście powinieneś uruchamiać to tylko lokalnie, ponieważ daje każdemu z przeglądarki prawo do wykonania dowolnego kodu python w kontekście serwera.
źródło
python 3.3
Trochę śmieci dla tagów szablonów:
Teraz w szablonie możesz zrobić
{{ template_var|pdb }}
sesję pdb i przejść do niej (pod warunkiem, że prowadzisz lokalny serwer deweloperski), gdzie możesz sprawdzićelement
zawartość swojego serca.To bardzo fajny sposób, aby zobaczyć, co się stało z twoim obiektem, gdy dotrze on do szablonu.
źródło
Istnieje kilka narzędzi, które dobrze ze sobą współpracują i mogą ułatwić zadanie debugowania.
Najważniejszy jest pasek narzędzi debugowania Django .
Następnie potrzebujesz dobrego rejestrowania za pomocą funkcji rejestrowania w języku Python . Możesz wysłać dane wyjściowe dziennika do pliku dziennika, ale łatwiejszą opcją jest wysłanie danych wyjściowych dziennika do firepython . Aby tego użyć, musisz użyć przeglądarki Firefox z rozszerzeniem firebug . Firepython zawiera wtyczkę Firebug, która wyświetla dowolne logowanie po stronie serwera w zakładce Firebug.
Sam Firebug ma również kluczowe znaczenie dla debugowania strony JavaScript w każdej opracowywanej aplikacji. (Zakładając, że masz oczywiście kod JS).
Podobało mi się również django-viewtools do interaktywnego debugowania widoków za pomocą pdb, ale nie używam go zbyt często.
Istnieją bardziej użyteczne narzędzia, takie jak spycharka do śledzenia wycieków pamięci (w odpowiedzi tutaj na SO dotyczące śledzenia pamięci podano również inne dobre sugestie).
źródło
Używam PyCharm (tego samego silnika pydev co eclipse). Naprawdę pomaga mi wizualnie móc przejść przez mój kod i zobaczyć, co się dzieje.
źródło
Jak dotąd wspomniano prawie wszystko, więc dodam tylko, że zamiast
pdb.set_trace()
jednego można użyć ipdb.set_trace (), który używa iPython i dlatego jest bardziej wydajny (autouzupełnianie i inne gadżety). Wymaga to pakietu ipdb, więc wystarczypip install ipdb
źródło
Naciskałem
django-pdb
na PyPI . Jest to prosta aplikacja, która oznacza, że nie musisz edytować kodu źródłowego za każdym razem, gdy chcesz włamać się do pdb.Instalacja jest po prostu ...
pip install django-pdb
'django_pdb'
do swojegoINSTALLED_APPS
Możesz teraz uruchomić:
manage.py runserver --pdb
włamać się do pdb na początku każdego widoku ...I uruchom:
manage.py test --pdb
włamać się do pdb przy błędach / błędach testu ...Projekt jest hostowany na GitHub , oczywiście mile widziane są prace.
źródło
Najłatwiejszym sposobem debugowania Pythona - szczególnie dla programistów używanych w Visual Studio - jest użycie PTVS (Python Tools for Visual Studio). Kroki są proste:
Jeśli chcesz debugować Django za pomocą PTVS, musisz wykonać następujące czynności:
źródło
Używam pyDev z Eclipse naprawdę dobrze, ustawiam punkty przerwania, wkraczam do kodu, wyświetlam wartości dowolnych obiektów i zmiennych, wypróbowuję.
źródło
Używam PyCharm i stoję przy tym przez cały czas. Trochę mnie to kosztowało, ale muszę powiedzieć, że korzyść, którą z tego czerpię, jest bezcenna. Próbowałem debugować z konsoli i daję ludziom dużo uznania, kto może to zrobić, ale dla mnie możliwość wizualnego debugowania moich aplikacji jest świetna.
Muszę jednak powiedzieć, że PyCharm zajmuje dużo pamięci. Ale z drugiej strony nic dobrego nie jest w życiu wolne. Właśnie przyszedł z ich najnowszą wersją 3. To także działa bardzo dobrze z Django, Flask i Google AppEngine. Podsumowując, powiedziałbym, że to świetne przydatne narzędzie dla każdego programisty.
Jeśli jeszcze go nie używasz, polecam pobrać wersję próbną na 30 dni, aby sprawdzić moc PyCharm. Jestem pewien, że dostępne są również inne narzędzia, takie jak Aptana. Ale chyba też podoba mi się wygląd PyCharm. Czuję się bardzo dobrze debugując tam moje aplikacje.
źródło
Czasami, kiedy chcę badać konkretną metodę i przywoływanie pdb jest po prostu zbyt kłopotliwe, dodam:
IPython.embed()
uruchamia powłokę IPython, która ma dostęp do zmiennych lokalnych od miejsca, w którym ją wywołujesz.źródło
from IPython import embed
a potem, gdy chcę szybko dodać punkt przerwania w kodzie, piszęembed()
. Oszczędza czas. Aby uniknąć utknięcia w pętli na zawsze, robię toembed();exit();
pudb
idebugger;
w JavaScript) do pliku, który edytuję. Po zakończeniu po prostudd
(usuwam całą linię), aby usunąć punkt przerwania. Pozwala to uniknąć ryzyka wprowadzenia linii importu debuggera do kontroli wersji lub konieczności wcześniejszego ustawienia importu na początku pliku.Z mojej perspektywy możemy podzielić typowe zadania debugowania kodu na trzy różne wzorce użytkowania:
assert False
miejsce, w którym chcesz się zatrzymać.import pudb; pudb.set_trace()
. Główną zaletą w stosunku do [i] pdb jest to, że PuDB (patrząc jak jesteś w latach 80-tych) sprawia, że ustawianie niestandardowych wyrażeń zegarka jest dziecinnie proste. A debugowanie wiązki zagnieżdżonych pętli jest o wiele prostsze dzięki GUI.Ach, tak, nieszczęścia szablonów. Najczęstszym (dla mnie i moich kolegów) problemem jest niewłaściwy kontekst: albo nie masz zmiennej, albo twoja zmienna nie ma żadnego atrybutu. Jeśli używasz paska narzędzi do debugowania , po prostu sprawdź kontekst w sekcji „Szablony” lub, jeśli to nie wystarczy, ustaw przerwę w kodzie widoków zaraz po zapełnieniu kontekstu.
Tak to idzie.
źródło
import pudb;pu.db
Bardzo polecam epdb (Extended Python Debugger).
https://bitbucket.org/dugan/epdb
Jedną z rzeczy, które uwielbiam w epdb do debugowania Django lub innych serwerów Python jest komenda epdb.serve (). Ustawia to śledzenie i podaje je na lokalnym porcie, z którym można się połączyć. Typowy przypadek użycia:
Mam pogląd, że chcę przejść krok po kroku. Wstawię następujące w miejscu, w którym chcę ustawić śledzenie.
Po uruchomieniu tego kodu otwieram interpreter języka Python i łączę się z instancją obsługującą. Mogę analizować wszystkie wartości i przechodzić przez kod za pomocą standardowych poleceń pdb, takich jak n, s itp.
I mnóstwo innych informacji na temat pisania pomocy epdb w dowolnym momencie.
Jeśli chcesz obsługiwać lub łączyć się z wieloma instancjami epdb jednocześnie, możesz określić port, na którym chcesz nasłuchiwać (domyślnie jest to 8080). To znaczy
host domyślnie ustawiony na „localhost”, jeśli nie został określony. Wrzuciłem to tutaj, aby zademonstrować, jak możesz to wykorzystać do debugowania czegoś innego niż lokalna instancja, na przykład serwer programistyczny w lokalnej sieci LAN. Oczywiście, jeśli to zrobisz, uważaj, aby zestaw śledzenia nigdy nie dotarł do twojego serwera produkcyjnego!
W skrócie, możesz nadal robić to samo co zaakceptowana odpowiedź za pomocą epdb (
import epdb; epdb.set_trace()
), ale chciałem podkreślić funkcjonalność serwowania, ponieważ uważam ją za bardzo przydatną.źródło
Właśnie znalazłem wdb ( http://www.rkblog.rk.edu.pl/w/p/debugging-python-code-browser-wdb-debugger/?goback=%2Egde_25827_member_255996401 ). Ma całkiem niezły interfejs użytkownika / GUI ze wszystkimi dzwonkami i gwizdkami. Autor mówi to o wdb -
„Istnieją IDE, takie jak PyCharm, które mają własne debuggery. Oferują podobny lub równy zestaw funkcji ... Jednak aby z nich skorzystać, musisz użyć tych konkretnych IDE (a niektóre z nich są niewolne lub mogą nie być dostępne dla wszystkich platformy). Wybierz narzędzie odpowiednie do swoich potrzeb ”.
Myślałem, że po prostu to przekażę.
Również bardzo pomocny artykuł o debuggerach w języku Python: https://zapier.com/engineering/debugging-python-boss/
Na koniec , jeśli chcesz zobaczyć ładny graficzny wydruk stosu wywołań w Django, sprawdź: https://github.com/joerick/pyinstrument . Wystarczy dodać pyinstrument.middleware.ProfilerMiddleware do MIDDLEWARE_CLASSES, a następnie dodać profil? Na końcu adresu URL żądania, aby aktywować profilowanie.
Można również uruchomić narzędzie Pyinstrument z wiersza polecenia lub importując jako moduł.
źródło
Dodaj
import pdb; pdb.set_trace()
lubbreakpoint()
(formularz python3.7) w odpowiednim wierszu kodu Python i uruchom go. Wykonanie zakończy się za pomocą interaktywnej powłoki. W powłoce możesz wykonać kod Pythona (tj. Wypisać zmienne) lub użyć poleceń takich jak:c
kontynuować wykonywanien
przejdź do następnego wiersza w ramach tej samej funkcjis
przejdź do następnego wiersza tej funkcji lub funkcji wywoływanejq
zamknij debugger / wykonanieZobacz także: https://poweruser.blog/setting-a-breakpoint-in-python-438e23fe6b28
źródło
Jedną z najlepszych opcji debugowania kodu Django jest wdb: https://github.com/Kozea/wdb
Zainstaluj i uruchom serwer, a w kodzie dodaj:
Według autora główne różnice w odniesieniu do
pdb
:Ma świetny interfejs użytkownika oparty na przeglądarce. Radość z użytkowania! :)
źródło
Używam PyCharm i różnych narzędzi do debugowania. Przygotuj też fajny zestaw artykułów na temat łatwego konfigurowania tych rzeczy dla nowicjuszy. Możesz zacząć tutaj. Mówi ogólnie o debugowaniu PDB i GUI w projektach Django. Mam nadzieję, że ktoś z nich skorzysta.
źródło
Jeśli używasz Aptana do programowania django, obejrzyj to: http://www.youtube.com/watch?v=qQh-UQFltJQ
Jeśli nie, rozważ użycie go.
źródło
Większość opcji jest już wspomniana. Aby wydrukować kontekst szablonu, stworzyłem do tego prostą bibliotekę. Zobacz https://github.com/edoburu/django-debugtools
Możesz go użyć do wydrukowania kontekstu szablonu bez żadnej
{% load %}
konstrukcji:Wykorzystuje dostosowany format pprint do wyświetlania zmiennych w
<pre>
znaczniku.źródło
Uważam, że Visual Studio Code jest świetny do debugowania aplikacji Django. Standardowe parametry launch.json w Pythonie działają
python manage.py
z dołączonym debuggerem, dzięki czemu można ustawić punkty przerwania i krok po kroku, jak chcesz.źródło
Dla tych, którzy mogą przypadkowo dodać pdb do zatwierdzeń na żywo, mogę zasugerować to rozszerzenie odpowiedzi #Koobz:
źródło
Z własnego doświadczenia wynika, że są dwa sposoby:
użyj ipdb , który jest ulepszonym debuggerem, takim jak pdb.
import ipdb;ipdb.set_trace()
lubbreakpoint()
(z python3.7)użyj powłoki django, po prostu użyj poniższego polecenia. Jest to bardzo pomocne podczas opracowywania nowego widoku.
python manage.py shell
źródło
gorąco polecam użyć PDB.
Możesz sprawdzić wszystkie wartości zmiennych, wejść do funkcji i wiele więcej. https://docs.python.org/2/library/pdb.html
do sprawdzania wszelkiego rodzaju zapytań, odpowiedzi i trafień do bazy danych. używam paska narzędzi django-debug- https://github.com/django-debug-toolbar/django-debug-toolbar
źródło
Jak wspomniano w innych postach tutaj - ustawianie punktów przerwania w kodzie i przechodzenie przez kod, aby sprawdzić, czy zachowuje się on zgodnie z oczekiwaniami, to świetny sposób na nauczenie się czegoś takiego jak Django, dopóki nie zorientujesz się, jak to wszystko się zachowuje - i jaki jest twój kod to robi.
W tym celu polecam użycie WingIde. Podobnie jak inne wspomniane IDE ładne i łatwe w użyciu, ładny układ, a także łatwe do ustawienia punkty przerwania oceniają / modyfikują stos itp. Idealne do wizualizacji tego, co robi Twój kod, gdy go przechodzisz. Jestem wielkim fanem tego.
Używam również PyCharm - ma doskonałą analizę kodu statycznego i może czasem pomóc wykryć problemy, zanim zdasz sobie sprawę, że one istnieją.
Jak już wspomniano, pasek narzędzi debugowania django jest niezbędny - https://github.com/django-debug-toolbar/django-debug-toolbar
I choć nie jest to jawnie narzędzie do debugowania lub analizy - jednym z moich ulubionych jest oprogramowanie pośredniczące do drukowania SQL dostępne w Django Snippets pod adresem https://djangosnippets.org/snippets/290/
Spowoduje to wyświetlenie zapytań SQL wygenerowanych przez Twój widok. To da ci dobre wyobrażenie o tym, co robi ORM i czy twoje zapytania są wydajne lub musisz przerobić kod (lub dodać buforowanie).
Uważam, że nieocenione jest monitorowanie wydajności zapytań podczas opracowywania i debugowania aplikacji.
Jeszcze jedna wskazówka - zmodyfikowałem ją nieznacznie na własny użytek, aby wyświetlała tylko podsumowanie, a nie instrukcję SQL ... Więc zawsze używam jej podczas programowania i testowania. Dodałem również, że jeśli len (connection.queries) jest większy niż wstępnie zdefiniowany próg, wyświetla dodatkowe ostrzeżenie.
Następnie, jeśli zauważę, że dzieje się coś złego (z punktu widzenia wydajności lub liczby zapytań), włączam ponownie pełne wyświetlanie instrukcji SQL, aby zobaczyć dokładnie, co się dzieje. Bardzo przydatny, gdy pracujesz nad dużym projektem Django z wieloma programistami.
źródło
użyj
pdb
lubipdb
. Różnica między tymi dwoma jest ipdb obsługuje automatyczne uzupełnianie.dla pdb
dla ipdb
Do wykonania
n
klawisza nowej linii, klawisz kontynuacji liniic
. zaznacz więcej opcji za pomocąhelp(pdb)
źródło
Dodatkowa sugestia.
Możesz wykorzystać testy nosa i pdb razem, zamiast wstrzykiwania
pdb.set_trace()
ręcznie swoje widoki. Zaletą jest to, że można zaobserwować warunki błędu przy pierwszym uruchomieniu, potencjalnie w kodzie innej firmy.Oto błąd dla mnie dzisiaj.
Teraz wiem, że to oznacza, że wygłupiłem konstruktora formularza i nawet mam dobre pojęcie, które pole jest problemem. Ale czy mogę użyć pdb, aby zobaczyć, na co chrupiące formularze narzekają, w szablonie ?
Tak, mogę. Korzystanie z --pdb opcję nosetests:
tests$ nosetests test_urls_catalog.py --pdb
Jak tylko trafię na jakiś wyjątek (w tym te obsługiwane z wdziękiem), pdb zatrzymuje się tam, gdzie to się dzieje, i mogę się rozejrzeć.
Teraz jest jasne, że moim argumentem wyboru do konstruktora chrupiącego pola była lista, która była listą, a nie lista / krotka krotek.
Fajne jest to, że ten pdb odbywa się w kodzie chrupiącego, a nie mojego i nie musiałem go wstawiać ręcznie.
źródło
Podczas programowania dodawanie szybkie
może pomóc zdiagnozować problemy w widokach lub gdziekolwiek indziej, bez potrzeby korzystania z debuggera.
źródło