Django'da hata ayıklama, iyi yol? [kapalı]


587

Bu yüzden Python ve daha sonra Django'da kod yazmayı öğrenmeye başladım . İlk kez izleri izlemek zordu ve aslında neyi yanlış yaptığımı ve sözdizimi hatasının nerede olduğunu anladım. Şimdi biraz zaman geçti ve yol boyunca bir yol, sanırım benim Django kodumu hata ayıklama rutin bir var. Bu, kodlama deneyimimde erken yapıldığı için oturdum ve bunu nasıl yaptığımın etkisiz olup olmadığını ve daha hızlı yapılabileceğini merak ettim. Genellikle kodumu hataları bulmak ve düzeltmek için yönetmek, ama daha hızlı yapmalı mıyım acaba?

Genellikle etkinleştirildiğinde Django'nun verdiği hata ayıklama bilgilerini kullanırım. İşler düşündüğüm gibi sona erdiğinde, kod akışını bir sözdizimi hatasıyla çok kırıyorum ve kodun istediğimden başka bir şey yaptığını anlamak için akıştaki o noktada değişkenlere bakıyorum.

Ancak bu iyileştirilebilir mi? Django kodunuzda hata ayıklamanın bazı iyi araçları veya daha iyi yolları var mı?


2
Ben çok kullanışlı django-debug-araç çubuğunu kullanmayı seviyorum
Diego Vinícius

1
Veya burada açıklandığı gibi Visual Studio Code'un yerleşik Python hata ayıklayıcısını kullanın code.visualstudio.com/docs/python/tutorial-django
Nick T

Yanıtlar:


536

Bunu yapmanın bir çok yolu var, ancak en basit olanı sadece Python hata ayıklayıcısını kullanmaktır . Django görünüm işlevine aşağıdaki satırı eklemeniz yeterlidir:

import pdb; pdb.set_trace()

veya

breakpoint()  #from Python3.7

Bu sayfayı tarayıcınıza yüklemeye çalışırsanız, tarayıcı askıda kalır ve gerçek yürütme kodunda hata ayıklamaya devam etmeniz istenir.

Ancak başka seçenekler de var (onları tavsiye etmiyorum):

* return HttpResponse({variable to inspect})

* print {variable to inspect}

* raise Exception({variable to inspect})

Ancak Python Hata Ayıklayıcı (pdb), tüm Python kodu türleri için şiddetle tavsiye edilir. Zaten pdb'ye giriyorsanız , hata ayıklama için ipython kullanan IPDB'ye de bakmak istersiniz .

Pdb için daha kullanışlı bazı uzantılar

Antash tarafından önerilen pdb ++ .

pudb , PatDuJour tarafından önerildi .

Seafangs tarafından önerilen Django'da Python hata ayıklayıcısını kullanma .


64
Pdb önermek için +1. Ancak, istemin konsolda görüneceği için bunun yalnızca yerel makinenizdeki geliştirme sunucusunu kullanırken gerçekten işe yaradığını belirtmek gerekir.
Daniel Roseman

12
Aşağıdaki yanıta göre ayrıca django-pdb'ye bakınız. Size verir manage.py runserver --pdbve manage.py test --pdbkomutları.
Tom Christie

4
@Daniel, bir konsolu zaten çalışan bir python örneğine sahip olmak için rconsole'a bakın .
Phob

12
Ayrıca göz atın ipython. Ipdbile birlikte gelen ipythonsekme tamamlama, renkli sözdizimi ve daha fazlası :-).
hobbes3

3
Cevabınızı yararlı buldum ama bir testte hata ayıklamaya çalışırken Django sonsuza dek sınır noktalarda asılıydı. Bu yüzden bana yardımcı olan bilgilendirici bir makale buldum: v3.mike.tig.as/blog/2010/09/14/pdb
driftcatcher

228

Werkzeug'un interaktif hata ayıklayıcısını gerçekten çok seviyorum . Geri izlemenin her düzeyinde etkileşimli bir kabuk elde etmeniz dışında Django'nun hata ayıklama sayfasına benzer. Django uzantılarını kullanırsanız, runserver_plusgeliştirme sunucusunu başlatan ve size özel durumlar için Werkzeug'un hata ayıklayıcısını veren bir yönetim komutu alırsınız .

Tabii ki, bunu sadece yerel olarak çalıştırmalısınız, çünkü tarayıcıya sahip herhangi birine sunucu bağlamında rasgele python kodu çalıştırma hakları verir.


2
Tarayıcıda gösterilen etkileşimli konsolda sekme tamamlamayı kullanmak mümkün müdür? "Tab" bizi bir sonraki açık konsola götürüyor, bir tuş kombinasyonu olup olmadığını merak ediyordum, ama bir tane bulamadım.
Ariel

@Werkzeug hata ayıklayıcısının sekme tamamlaması yok.
Håken Lid

API'larda hata ayıklama yapıyorsanız , Werkzeug hata ayıklayıcısına küçük bir bükülme ekleyen django-rundbg'yi deneyebilirsiniz .
elpaquete

Kadar sadecepython 3.3
Timo


166

Şablon etiketleri için küçük bir şipşak:

@register.filter 
def pdb(element):
    import pdb; pdb.set_trace()
    return element

Şimdi, bir şablonun içinde kalbinizin içeriğini {{ template_var|pdb }}inceleyebileceğiniz bir pdb oturumu (yerel devel sunucusunu çalıştırdığınız göz önüne alındığında) girebilir ve girebilirsiniz element.

Şablona geldiğinde nesnenize ne olduğunu görmek için çok güzel bir yol.


1
bu harika. Şablon sorunları yaşıyorsanız yapabileceğiniz başka bir şey, jinja2'ye (tabutla yüklenir) geçmek - bence bir gelişme olan django şablonlarının bir uzantısı. Ayrıca şablonlar ve şablon devralmalarını django'dan daha iyi geri izleme çerçevelerine entegre eder.
çarpışma

Bu çok hoş. Ne yazık ki, bunu bir pdb ithalatı da dahil olmak üzere herhangi bir taahhüdü reddeden bir kod tabanına entegre etmenin temiz bir yolunu görmek zor.
Jon Kiparsky

83

İyi işbirliği yapan ve hata ayıklama görevinizi kolaylaştırabilecek birkaç araç vardır.

En önemlisi Django hata ayıklama araç çubuğudur .

O zaman Python kayıt tesisini kullanarak iyi bir kayıt gerekir . Günlük çıktısını bir günlük dosyasına gönderebilirsiniz, ancak daha kolay bir seçenek günlük çıkışını firepython'a göndermektir . Bunu kullanmak için firebug uzantısıyla Firefox tarayıcısını kullanmanız gerekir . Firepython, bir Firebug sekmesinde sunucu tarafı günlük kaydını görüntüleyecek bir firebug eklentisi içerir.

Firebug, geliştirdiğiniz herhangi bir uygulamanın Javascript tarafında hata ayıklamak için de önemlidir. (Tabii ki bazı JS kodunuz varsa).

Ayrıca pdb kullanarak etkileşimli görünümlerde hata ayıklama için django-viewtools sevdim , ama o kadar kullanmıyorum.

Bellek sızıntılarını izlemek için dozer gibi daha kullanışlı araçlar vardır (ayrıca bellek izleme için SO'daki cevaplarda verilen diğer iyi öneriler de vardır).


65

Kullandığım pycharm (Tutulma aynı Pydev motoru). Gerçekten görsel olarak benim kod adım atmak ve neler olduğunu görmek için yardımcı olur.


2
Bu konuda en iyi şey, sadece çalışır ve tamamen sezgisel olmasıdır. Bir satırın soluna tıklayın ve hata ayıklama düğmesine basın. Dahili kodun nasıl çalıştığını daha iyi anlamak istiyorsanız, Django kaynak kodu için de iyi çalışır. Fark etmeden önce biraz zaman aldı, ancak dosya gezgininin Harici Kitaplıklar klasöründeki kodlardan herhangi birine kesme noktaları koyabilirsiniz.
Michael Bylstra

6
PyCharm'ın krediler için başlık altında PyDev hata ayıklayıcı kullandığını belirtmek gerekir.
Medeiros


44

Neredeyse her şey şimdiye kadar bahsedildi, bu yüzden sadece bir yerine iPython kullanan ve bu nedenle daha güçlü (otomatik tamamlama ve diğer hediyeler) ipdb.set_trace ()pdb.set_trace() kullanabilirsiniz ekleyeceğiz . Bu ipdb paketi gerektirir, bu yüzden sadecepip install ipdb


2
Çok yararlı bir yapışkan mod sağlayan pdb ++ öneririm.
Sandeep

34

Ben aktardıktan django-pdbiçin PyPI . Bu, pdb'ye her girmek istediğinizde kaynak kodunuzu düzenlemeniz gerekmediği anlamına gelen basit bir uygulamadır.

Kurulum sadece ...

  1. pip install django-pdb
  2. Ekle 'django_pdb'için seninINSTALLED_APPS

Şimdi koşabilirsiniz: manage.py runserver --pdbher görünümün başında pdb'ye girmek için ...

bash: manage.py runserver --pdb
Validating models...

0 errors found
Django version 1.3, using settings 'testproject.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

GET /
function "myview" in testapp/views.py:6
args: ()
kwargs: {}

> /Users/tom/github/django-pdb/testproject/testapp/views.py(7)myview()
-> a = 1
(Pdb)

Ve çalıştır: manage.py test --pdbtest hataları / hataları üzerinde pdb'ye girmek için ...

bash: manage.py test testapp --pdb
Creating test database for alias 'default'...
E
======================================================================
>>> test_error (testapp.tests.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File ".../django-pdb/testproject/testapp/tests.py", line 16, in test_error
    one_plus_one = four
NameError: global name 'four' is not defined
======================================================================

> /Users/tom/github/django-pdb/testproject/testapp/tests.py(16)test_error()
-> one_plus_one = four
(Pdb)

Proje GitHub'da barındırılıyor , katkılar elbette hoş karşılanıyor.


3
Kesilecek dosya / satır numarasını (yalnızca görünümü değil) belirleyebilmeniz harika olurdu.
Anson MacKeracher

Hangi yapım aşamasında inert olan yorumlar gibi kodda bırakabilirsiniz. Belki de bu kötü bir parazittir, ancak araları willy-nilly'yi etkili bir şekilde şeritlemek ve uygulamak harika olurdu.
Gliserin

Bunu son zamanlarda yükledim, ancak Tom'un django-pdb tarafından belgelendiği gibi geliştirici ayarlarımda yalnızca "POST_MORTEM = True" yapılandırmayı anladım. Şimdi sadece birlikte gezinebilirim ve işler kötüye gittiğinde hemen sorunun yerine düştüm. Teşekkürler Tom!
Joseph Sheedy

21

Python'da hata ayıklamanın en kolay yolu - özellikle Visual Studio'da kullanılan programcılar için - PTVS (Visual Studio için Python Araçları) kullanmaktır. Adımlar basit:

  1. Http://pytools.codeplex.com/ adresinden indirip yükleyin.
  2. Kesme noktalarını ayarlayın ve F5 tuşuna basın.
  3. Kesme noktanız isabet ettiğinde, değişkenleri hata ayıklama C # / C ++ programlarında görüntüleyebilir / değiştirebilirsiniz.
  4. Bu kadar :)

Django'da PTVS kullanarak hata ayıklamak istiyorsanız, aşağıdakileri yapmanız gerekir:

  1. Proje ayarları - Genel sekmesinde, "Başlangıç ​​Dosyası" nı Django programının giriş noktası olan "manage.py" olarak ayarlayın.
  2. Proje ayarları - Hata Ayıkla sekmesinde, "Komut Dosyası Bağımsız Değişkenleri" ni "runserver --noreload" olarak ayarlayın. Burada kilit nokta "--noreload". Ayarlamazsanız, kesme noktalarınız vurulmaz.
  3. Tadını çıkar.

1
Teşekkürler, bu harika çalıştı. --Noreload ihtiyacımız olan şeydi
Tom Gruner

Uzak sunucuda hata ayıklama özelliği var mı - şu anda kullandığım Eclipse PyDev'e benzer mi?
Daniel Sokolowski

Bununla ilgili sorunlar yaşıyorum. Adımlarını takip ettim ama hala çalışmıyor. Sadece * .py dosyalarının kesme noktalarında durur, * .html dosyalarında durmaz.
blfuentes

16

Eclipse ile pyDev kullanın gerçekten iyi, kesme noktaları ayarlamak, koda adım, herhangi bir nesne ve değişkenler üzerinde değerleri görüntülemek, deneyin.


Dev sunucusunu eclipse aracılığıyla çalıştırmanız gerekir (düşük çaba gerektiren hata ayıklama deneyimi için). PyDev uzaktan hata ayıklama olduğunu iddia ediyor, ancak hiç kullanmamış olsam, gerçekten geliştirme deneyiminin kalitesi hakkında konuşamam. Ayrıntılar: pydev.org/manual_adv_remote_debugger.html
synthesizerpatel

2
PyDev'in uzaktan hata ayıklayıcısı, Django'nun dev sunucusuyla harika bir şekilde çalışıyor. "Dosya değiştirildiğinde, otomatik olarak modülü yeniden yüklensin mi?" PyDev'in Çalıştır / Hata Ayıkla ayarlarında '' devre dışı '' seçeneği. Aksi takdirde, dev sunucusu ve pydev hata ayıklama sırasında kodu yeniden yüklemeye çalışır, bu da ikisini de son derece karışık hale getirir.
coredumperror

12

Kullandığım pycharm ve onun tarafından tüm yol standı. Bana biraz mal oldu ama ben bunun dışına almak avantajı paha biçilemez olduğunu söylemek gerekir. Konsoldan hata ayıklamayı denedim ve insanlara bunu yapabilen çok fazla kredi veriyorum, ancak benim için uygulamalarımı görsel olarak hata ayıklamak harika.

Söylemeliyim ki, PyCharm çok fazla bellek alıyor. Ama sonra tekrar, hayatta hiçbir şey özgür değildir. En son sürüm 3 ile birlikte geldiler. Ayrıca Django, Flask ve Google AppEngine ile çok iyi oynuyor. Sonuçta, herhangi bir geliştirici için harika bir kullanışlı araç olduğunu söyleyebilirim.

Henüz kullanmıyorsanız, PyCharm'ın gücüne bir göz atmak için 30 gün boyunca deneme sürümünü almanızı tavsiye ederim. Eminim ki Aptana gibi başka araçlar da vardır. Ama sanırım PyCharm'ın görünüşünü de seviyorum. Uygulamalarım orada hata ayıklamak için çok rahat hissediyorum.


Satın aldığım ilk IDE olabilir. Bir projenin bir VM'de hata ayıklanması, ödemeye değer büyü gibi geliyor.
Rob Grant

10

Bazen belirli bir yöntemle keşfetmek istediğimde ve pdb'yi çağırmak çok hantal olduğunda, şunu eklerdim:

import IPython; IPython.embed()

IPython.embed() yerel değişkenlere çağırdığınız noktadan erişimi olan bir IPython kabuğu başlatır.


Şimdi dosyanın üst kısmında bunu yapmak için bir alışkanlık yaptık from IPython import embedve sonra hızlı bir şekilde kodda bir kesme noktası eklemek istediğinizde, yazıyorum embed(). Zaman kazandırır. Sonsuza kadar döngülerde sıkışmaktan kaçınmak için yapıyorumembed();exit();
Mayank Jaiswal

@MayankJaiswal: Düzenlediğim dosyaya bu pasajı (ve JavaScript için pudbve debugger;JavaScript'te benzer parçacıkları) eklemek için Vim'de bir anahtar eşlemem vardı . Bitirdikten sonra dd, kesme noktasını kaldırmak için sadece (tüm satırı sil). Bu, hata ayıklayıcı içe aktarma satırını sürüm denetimine alma veya içe aktarma işlemini önce dosyanın üst kısmında önceden ayarlamak zorunda kalma riskini önler.
Yalan Ryan

10

Benim bakış açımdan, ortak kod hata ayıklama görevlerini üç farklı kullanım modeline ayırabiliriz:

  1. Bir şey istisna yarattı : runserver_plus 'Werkzeug hata ayıklayıcı kurtarmaya. Tüm izleme düzeylerinde özel kod çalıştırma yeteneği bir katildir. Tamamen takılırsanız, yalnızca bir tıklamayla paylaşmak için bir Gist oluşturabilirsiniz.
  2. Sayfa oluşturulur, ancak sonuç yanlıştır : yine Werkzeug sallanır. Kodda bir kesme noktası oluşturmak için, assert Falsedurdurmak istediğiniz yeri yazın .
  3. Kod yanlış çalışıyor , ancak hızlı görünüm yardımcı olmuyor. Büyük olasılıkla algoritmik bir problem. İç çekmek. Sonra genellikle ayıklayıcı bir konsolu ateş PuDB : import pudb; pudb.set_trace(). [İ] pdb üzerindeki ana avantaj, PuDB'nin (80'lerde olduğunuzda) özel saat ifadelerini ayarlamayı bir esinti haline getirmesidir. Ve bir grup iç içe döngüde hata ayıklamak bir GUI ile çok daha basittir.

Ah, evet, şablonların sıkıntısı. En yaygın (benim ve meslektaşlarım için) sorun yanlış bir bağlamdır: ya bir değişkeniniz yoktur ya da değişkeninizin bir özelliği yoktur. Hata ayıklama araç çubuğu kullanıyorsanız , "Şablonlar" bölümündeki bağlamı inceleyin veya yeterli değilse, bağlamınız dolduktan hemen sonra görünümlerinizin kodunda bir mola verin.

O zaman o gider.


sadece daha az kullanarak yazınimport pudb;pu.db
Sławomir Lenart

6

Epdb (Extended Python Debugger) tavsiye ederim.

https://bitbucket.org/dugan/epdb

Django veya diğer Python web sunucularında hata ayıklamak için epdb hakkında sevdiğim bir şey epdb.serve () komutudur. Bu, bir iz ayarlar ve bunu bağlanabileceğiniz yerel bir bağlantı noktasında sunar. Tipik kullanım durumu:

Adım adım ilerlemek istediğim bir görüşüm var. İzi ayarlamak istediğim noktaya aşağıdakileri ekleyeceğim.

import epdb; epdb.serve()

Bu kod yürütüldükten sonra bir Python yorumlayıcısı açıp sunum örneğine bağlanıyorum. Tüm değerleri analiz edebilir ve n, s vb. Standart pdb komutlarını kullanarak kod boyunca adım atabilirim.

In [2]: import epdb; epdb.connect()
(Epdb) request
<WSGIRequest
path:/foo,
GET:<QueryDict: {}>, 
POST:<QuestDict: {}>,
...
>
(Epdb) request.session.session_key
'i31kq7lljj3up5v7hbw9cff0rga2vlq5'
(Epdb) list
 85         raise some_error.CustomError()
 86 
 87     # Example login view
 88     def login(request, username, password):
 89         import epdb; epdb.serve()
 90  ->     return my_login_method(username, password)
 91
 92     # Example view to show session key
 93     def get_session_key(request):
 94         return request.session.session_key
 95

Ve istediğiniz zaman epdb yardımı yazmayı öğrenebileceğiniz tonlarca daha fazlası.

Aynı anda birden çok epdb örneğine sunmak veya bu sunucuya bağlanmak istiyorsanız, dinlenecek bağlantı noktasını belirtebilirsiniz (varsayılan 8080'dir). yani

import epdb; epdb.serve(4242)

>> import epdb; epdb.connect(host='192.168.3.2', port=4242)

belirtilmezse ana makine varsayılanı 'localhost' olur. Bunu yerel LAN'ınızdaki bir geliştirme sunucusu gibi yerel bir örnekten başka bir şeyi ayıklamak için nasıl kullanabileceğinizi göstermek için buraya attım. Açıkçası, bunu yaparsanız set izinin asla üretim sunucunuza gelmemesine dikkat edin!

Hızlı bir not olarak, yine de epdb ( import epdb; epdb.set_trace()) ile kabul edilen cevapla aynı şeyi yapabilirsiniz, ancak çok kullanışlı bulduğumdan hizmet işlevini vurgulamak istedim.


epdb 2011'den beri güncellenmemektedir. Django ve / veya Python'un daha yeni sürümlerinde kullanmakta sorun yaşadınız mı?
Seperman

Hiç Python 2 (özellikle 2.4-2.7) karşı kullanarak sorunları karşılaştım. Aslında birkaç gün önce kullandım. Python 3 ile hiç denemedim.
Jacinda

1
Python 2.7'de django 1.8 kullanıyorum ve epdb.connect'i epdb.serve ile konuşmak için alamıyorum. Sadece bir mola alıyorum.
David Watson

6

Wdb'yi yeni buldum ( http://www.rkblog.rk.edu.pl/w/p/debugging-python-code-browser-wdb-debugger/?goback=%2Egde_25827_member_255996401 ). Tüm çan ve ıslık ile oldukça güzel bir kullanıcı arayüzü / GUI vardır. Yazar wdb hakkında söylüyor -

"PyCharm gibi kendi hata ayıklayıcıları olan IDE'ler var. Benzer veya eşit özellikler sunuyorlar ... Ancak bunları kullanmak için bu belirli IDE'leri kullanmalısınız (ve bazıları ücretsiz değildir veya herkes için mevcut olmayabilir İhtiyaçlarınız için doğru aracı seçin. "

Sadece geçireceğimi düşündüm.

Ayrıca python hata ayıklayıcıları hakkında çok yararlı bir makale: https://zapier.com/engineering/debugging-python-boss/

Son olarak , Django'da çağrı yığınınızın güzel bir grafik çıktısını görmek istiyorsanız, ödeme yapın: https://github.com/joerick/pyinstrument . MIDDLEWARE_CLASSES öğesine pyinstrument.middleware.ProfilerMiddleware öğesini ekleyin, ardından profili oluşturucuyu etkinleştirmek için istek URL'sinin sonuna? Profili ekleyin.

Pyinstrument'ı komut satırından veya modül olarak içe aktararak da çalıştırabilirsiniz.


PyCharm sadece PyDev'i kullanıyor, sanırım kendi değil.
Rob Grant

6

Python kodundaki ilgili satıra ekleyin import pdb; pdb.set_trace()veya breakpoint() (python3.7 oluşturun) ve yürütün. Yürütme etkileşimli bir kabukla duracaktır. Kabukta Python kodunu yürütebilir (yani yazdırma değişkenleri) veya aşağıdaki gibi komutları kullanabilirsiniz:

  • c yürütmeye devam et
  • n aynı fonksiyon içindeki bir sonraki satıra adım at
  • s bu fonksiyondaki bir sonraki satıra veya çağrılan bir fonksiyona adım at
  • q hata ayıklayıcıdan / yürütmeden çık

Ayrıca bakınız: https://poweruser.blog/setting-a-breakpoint-in-python-438e23fe6b28


5

Django kodunda hata ayıklamak için en iyi seçeneklerden biri wdb'dir: https://github.com/Kozea/wdb

wdb python 2 (2.6, 2.7), python 3 (3.2, 3.3, 3.4, 3.5) ve pypy ile çalışır. Daha da iyisi, bir python 2 programında python 3 üzerinde çalışan bir wdb sunucusu ile hata ayıklama yapmak veya tam tersi veya üçüncü bir bilgisayarda bir web sayfasında başka bir bilgisayarda çalışan bir hata ayıklama sunucusu ile bir bilgisayarda çalışan bir programda hata ayıklamak mümkündür! Daha da iyisi, şu anda çalışan bir python işlemini / iş parçacığını web arayüzünden kod enjeksiyonunu kullanarak duraklatmak artık mümkün. (Bu gdb ve ptrace etkin gerektirir) Başka bir deyişle güzel özellikler ile doğrudan tarayıcınızda pdb'nin çok gelişmiş bir sürümüdür.

Sunucuyu kurun ve çalıştırın ve kodunuza şunları ekleyin:

import wdb
wdb.set_trace()

Yazara göre, temel farklılıklar pdbşunlardır:

Projeyi bilmeyenler için, wdb, pdb gibi bir python hata ayıklayıcıdır, ancak kaygan bir web ön ucu ve aşağıdakiler gibi birçok ek özelliğe sahiptir:

  • Kaynak sözdizimi vurgulama
  • Görsel kesme noktaları
  • Jedi kullanarak etkileşimli kod tamamlama
  • Kalıcı kesme noktaları
  • Fareyi kullanarak derin nesne denetimi Çoklu iş parçacığı / Çok işlemeli destek
  • Uzaktan hata ayıklama
  • İfadeleri izleyin
  • Hata ayıklayıcı kodu sürümünde
  • Hatayı kesmek için popüler web sunucuları entegrasyonu
  • Örneğin, werkzeug hata ayıklayıcısının aksine, izleme sırasında kırılma (ölüm sonrası değil)
  • Şu anda çalışan programları kod enjeksiyonu yoluyla kırma (desteklenen sistemlerde)

Harika bir tarayıcı tabanlı kullanıcı arayüzüne sahiptir. Kullanmak için bir zevk! :)


Pdb ile fark nedir?
Dunatotatos

4

Kullandığım pycharm ve farklı hata ayıklama araçları. Ayrıca kolay acemiler için bu şeyleri ayarlamak hakkında güzel bir makale var. Buradan başlayabilirsiniz. Genel olarak Django projeleriyle PDB ve GUI hata ayıklamasını anlatıyor. Umarım birisi onlardan faydalanır.



2

Çoğu seçenek belirtilir. Şablon içeriğini yazdırmak için bunun için basit bir kütüphane oluşturdum. Bkz. Https://github.com/edoburu/django-debugtools

Herhangi bir {% load %}yapı olmadan şablon içeriğini yazdırmak için kullanabilirsiniz :

{% print var %}   prints variable
{% print %}       prints all

Bir <pre>etiketteki değişkenleri görüntülemek için özelleştirilmiş bir pprint biçimi kullanır .


2

Visual Studio Code, Django uygulamalarında hata ayıklamak için harika buluyorum. Standart python launch.json parametreleri python manage.pyhata ayıklayıcı eklenmiş olarak çalışır, böylece kesme noktalarını ayarlayabilir ve kodunuzu istediğiniz gibi geçebilirsiniz.


2

Yanlışlıkla canlı taahhütlere pdb ekleyebilecek olanlar için, #Koobz cevabının bu uzantısını önerebilirim:

@register.filter 
def pdb(element):
    from django.conf import settings
    if settings.DEBUG:    
        import pdb
        pdb.set_trace()
    return element

2

Kendi tecrübelerime göre, iki yol var:

  1. pdb gibi gelişmiş bir hata ayıklayıcı olan ipdb kullanın .

    import ipdb;ipdb.set_trace()veya breakpoint() (python3.7'den)

  2. django kabuğunu kullanın, sadece aşağıdaki komutu kullanın. Yeni bir görüş geliştirirken bu çok yardımcı olur.

    python manage.py shell



1

Buradaki diğer gönderilerde belirtildiği gibi - kodunuzda kesme noktaları ayarlamak ve kodun beklediğiniz gibi davranıp davranmadığını görmek için yürümek, hepsinin nasıl davrandığını ve kodunuzun ne olduğunu iyi bir şekilde anlayana kadar Django gibi bir şey öğrenmenin harika bir yoludur. yapıyor.

Bunu yapmak için WingIde kullanmanızı tavsiye ederim. Diğer bahsedilen IDE'ler gibi güzel ve kullanımı kolay, güzel düzen ve kesme noktalarını ayarlamak kolay, yığını değerlendirir / değiştirir vb. Kodunuzu adım adım yaptığınızda görselleştirmek için mükemmeldir. Ben büyük bir hayranıyım.

Ayrıca PyCharm'ı kullanıyorum - mükemmel statik kod analizi var ve bazen orada olduklarını fark etmeden önce sorunları tespit etmeye yardımcı olabilir.

Daha önce de belirtildiği gibi django-debug-araç çubuğu önemlidir - https://github.com/django-debug-toolbar/django-debug-toolbar

Ve açıkça bir hata ayıklama veya analiz aracı olmasa da - favorilerimden biri , https://djangosnippets.org/snippets/290/ adresindeki Django Snippet'lerinden temin edilebilen SQL Printing Middleware.

Bu, görünümünüzün oluşturduğu SQL sorgularını görüntüler. Bu, ORM'in ne yaptığını ve sorgularınızın verimli olup olmadığını veya kodunuzu yeniden çalıştırmanız (veya önbellek eklemeniz) gerekiyorsa iyi bir fikir verecektir.

Uygulamamı geliştirirken ve hata ayıklarken sorgu performansını takip etmeyi çok değerli buluyorum.

Sadece bir başka ipucu - Ben sadece SQL deyimi değil, sadece özet göstermek için kendi kullanımı için biraz değiştirdi .... Bu yüzden her zaman geliştirme ve test sırasında kullanmak. Ayrıca len (connection.queries) önceden tanımlanmış bir eşikten büyükse ekstra bir uyarı görüntülediğini de ekledim.

Sonra kötü bir şey (performans veya sorgu bakış açısından) oluyor ben tam olarak neler olduğunu görmek için SQL ifadeleri tam ekran geri dönün. Birden çok geliştiriciye sahip büyük bir Django projesi üzerinde çalışırken çok kullanışlıdır.


1

pdbveya kullanın ipdb. Bu ikisi arasındaki fark IPDB otomatik tamamlama destekler.

pdb için

import pdb
pdb.set_trace()

ipdb için

import ipdb
ipdb.set_trace()

Yeni satır hit ntuşunu çalıştırmak için, hit ctuşuna devam etmek için . kullanarak daha fazla seçenek kontrol ethelp(pdb)


0

Ek bir öneri.

Kaldıraç nosetests ve Pdb yerine enjekte birlikte pdb.set_trace()manuel görünümlerinde. Avantajı, hata koşullarını ilk başladığında, muhtemelen 3. taraf kodunda gözlemleyebilmenizdir.

İşte bugün benim için bir hata.

TypeError at /db/hcm91dmo/catalog/records/

render_option() argument after * must be a sequence, not int

....


Error during template rendering

In template /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/crispy_forms/templates/bootstrap3/field.html, error at line 28
render_option() argument after * must be a sequence, not int
18  
19          {% if field|is_checkboxselectmultiple %}
20              {% include 'bootstrap3/layout/checkboxselectmultiple.html' %}
21          {% endif %}
22  
23          {% if field|is_radioselect %}
24              {% include 'bootstrap3/layout/radioselect.html' %}
25          {% endif %}
26  
27          {% if not field|is_checkboxselectmultiple and not field|is_radioselect %}
28  

      {% if field|is_checkbox and form_show_labels %}

Şimdi, bunun yapıcıyı form için kandırdığım anlamına geldiğini biliyorum ve hatta hangi alanın sorun olduğu hakkında iyi bir fikrim var. Ancak, bir şablonda hangi gevrek formların şikayet ettiğini görmek için pdb kullanabilir miyim ?

Evet yapabilirim. Nosetestlerde --pdb seçeneğini kullanma :

tests$ nosetests test_urls_catalog.py --pdb

Herhangi bir istisnayı vurur vurmaz (zarif bir şekilde işlenenler dahil), pdb nerede durur ve etrafa bakabilirim.

  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py", line 537, in __str__
    return self.as_widget()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py", line 593, in as_widget
    return force_text(widget.render(name, self.value(), attrs=attrs))
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py", line 513, in render
    options = self.render_options(choices, [value])
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py", line 543, in render_options
    output.append(self.render_option(selected_choices, *option))
TypeError: render_option() argument after * must be a sequence, not int
INFO lib.capture_middleware log write_to_index(http://localhost:8082/db/hcm91dmo/catalog/records.html)
INFO lib.capture_middleware log write_to_index:end
> /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py(543)render_options()
-> output.append(self.render_option(selected_choices, *option))
(Pdb) import pprint
(Pdb) pprint.PrettyPrinter(indent=4).pprint(self)
<django.forms.widgets.Select object at 0x115fe7d10>
(Pdb) pprint.PrettyPrinter(indent=4).pprint(vars(self))
{   'attrs': {   'class': 'select form-control'},
    'choices': [[('_', 'any type'), (7, (7, 'type 7', 'RECTYPE_TABLE'))]],
    'is_required': False}
(Pdb)         

Şimdi, gevrek alan yapıcısına yaptığım seçimler argümanı, bir liste / tuples listesi yerine bir liste içinde bir liste olduğu açıktı.

 'choices': [[('_', 'any type'), (7, (7, 'type 7', 'RECTYPE_TABLE'))]]

Temiz şey, bu pdb benim değil çıtır'ın kodu içinde yer alıyor ve ben elle eklemek gerek yoktu.


0

Geliştirme sırasında, hızlı bir şekilde ekleme

assert False, value

hata ayıklayıcı kullanmaya gerek kalmadan görünümlerde veya başka herhangi bir yerde sorunları teşhis etmeye yardımcı olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.