Bagaimana cara debug di Django, cara yang baik? [Tutup]

587

Jadi, saya mulai belajar kode dengan Python dan kemudian Django . Pertama kali sulit melihat traceback dan benar-benar mencari tahu apa yang saya lakukan salah dan di mana kesalahan sintaks berada. Beberapa waktu telah berlalu sekarang dan beberapa jalan sepanjang jalan, saya kira saya mendapat rutin dalam debugging kode Django saya. Karena ini dilakukan di awal pengalaman pengkodean saya, saya duduk dan bertanya-tanya apakah cara saya melakukan ini tidak efektif dan bisa dilakukan lebih cepat. Saya biasanya berhasil menemukan dan memperbaiki bug dalam kode saya, tetapi saya bertanya-tanya apakah saya harus melakukannya lebih cepat?

Saya biasanya hanya menggunakan info debug yang diberikan Django saat diaktifkan. Ketika hal-hal berakhir seperti yang saya pikirkan, saya memutuskan aliran kode banyak dengan kesalahan sintaks, dan melihat variabel pada titik itu dalam aliran untuk mencari tahu, di mana kode melakukan sesuatu selain apa yang saya inginkan.

Tetapi dapatkah ini diperbaiki? Apakah ada beberapa alat yang baik atau cara yang lebih baik untuk men-debug kode Django Anda?

googletorp
sumber
2
saya suka menggunakan Django-debug-toolbar, sangat mudah
Diego Vinícius
1
Atau gunakan Visual Studio Code yang dibangun di Python debugger seperti yang dijelaskan di sini code.visualstudio.com/docs/python/tutorial-django
Nick T

Jawaban:

536

Ada banyak cara untuk melakukannya, tetapi yang paling mudah adalah dengan menggunakan debugger Python . Cukup tambahkan baris berikut ke fungsi tampilan Django:

import pdb; pdb.set_trace()

atau

breakpoint()  #from Python3.7

Jika Anda mencoba memuat halaman itu di browser Anda, browser akan hang dan Anda mendapatkan prompt untuk melakukan debugging pada kode eksekusi yang sebenarnya.

Namun ada opsi lain (saya tidak merekomendasikan mereka):

* return HttpResponse({variable to inspect})

* print {variable to inspect}

* raise Exception({variable to inspect})

Tapi Python Debugger (pdb) sangat disarankan untuk semua jenis kode Python. Jika Anda sudah masuk ke pdb, Anda juga ingin melihat IPDB yang menggunakan ipython untuk debugging.

Beberapa ekstensi yang lebih bermanfaat untuk pdb adalah

pdb ++ , disarankan oleh Antash .

pudb , disarankan oleh PatDuJour .

Menggunakan debugger Python di Django , disarankan oleh Seafangs .

cukup keras
sumber
64
+1 untuk menyarankan pdb. Namun perlu dicatat bahwa ini hanya benar-benar berfungsi ketika menggunakan server pengembangan pada mesin lokal Anda, karena prompt akan muncul di konsol.
Daniel Roseman
12
Lihat juga django-pdb sesuai jawaban saya di bawah ini. Memberi Anda manage.py runserver --pdbdan manage.py test --pdbperintah.
Tom Christie
4
@Aniel, lihat rconsole untuk memiliki konsol menjadi contoh python yang sudah berjalan.
Phob
12
Lihat ipythonjuga. Ipdb, yang datang dengan ipython, fitur penyelesaian tab, sintaks berwarna, dan banyak lagi :-).
hobbes3
3
Saya menemukan jawaban Anda berguna tetapi Django menggantung selamanya di breakpoints saya, ketika saya mencoba men-debug tes. Jadi saya mencari dan menemukan artikel informatif yang membantu saya: v3.mike.tig.as/blog/2010/09/14/pdb
driftcatcher
228

Saya sangat suka debugger interaktif Werkzeug . Ini mirip dengan halaman debug Django, kecuali Anda mendapatkan shell interaktif di setiap tingkat traceback. Jika Anda menggunakan django-extensions , Anda mendapatkan runserver_plusperintah manajemen yang memulai server pengembangan dan memberi Anda debugger Werkzeug tentang pengecualian.

Tentu saja, Anda hanya boleh menjalankan ini secara lokal, karena memberikan siapa pun dengan browser hak untuk mengeksekusi kode python sewenang-wenang dalam konteks server.

Benjamin Wohlwend
sumber
2
Apakah mungkin untuk menggunakan penyelesaian tab di konsol interaktif yang diperlihatkan di browser? "Tab" hanya membawa kita ke konsol terbuka berikutnya, saya bertanya-tanya apakah ada kombinasi tombol, tetapi saya tidak dapat menemukannya.
Ariel
@Ariel debugger werkzeug tidak memiliki penyelesaian tab.
Tutup Håken
Jika Anda debbugging API, Anda bisa mencoba Django-rundbg yang menambahkan sedikit twist pada debugger Werkzeug.
elpaquete
Hanya sampaipython 3.3
Timo
tidak mendukung saluran github.com/pallets/werkzeug/issues/1322
Paolo
166

Quickie kecil untuk tag templat:

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

Sekarang, di dalam templat yang dapat Anda lakukan {{ template_var|pdb }}dan masukkan sesi pdb (mengingat Anda menjalankan server devel lokal) di mana Anda dapat memeriksa elementisi hati Anda.

Ini cara yang sangat bagus untuk melihat apa yang terjadi pada objek Anda ketika tiba di templat.

Koobz
sumber
1
ini bagus. Hal lain yang dapat Anda lakukan jika Anda memiliki masalah template adalah beralih ke jinja2 (dimuat melalui peti mati) - ini merupakan perpanjangan dari template Django, yang merupakan peningkatan menurut saya. Ini juga mengintegrasikan templat & pewarisan templat ke dalam bingkai traceback jauh lebih baik daripada Django
aplikasi cepat
Ini indah. Sayangnya, sulit untuk melihat cara bersih untuk mengintegrasikan ini ke dalam basis kode yang menolak komit termasuk impor pdb.
Jon Kiparsky
83

Ada beberapa alat yang bekerja sama dengan baik dan dapat membuat tugas debug Anda lebih mudah.

Paling penting adalah bilah alat debug Django .

Maka Anda perlu login yang baik menggunakan fasilitas logging Python . Anda dapat mengirim keluaran logging ke file log, tetapi opsi yang lebih mudah adalah mengirim output log ke firepython . Untuk menggunakan ini, Anda perlu menggunakan browser Firefox dengan ekstensi pembakar . Firepython menyertakan plugin firebug yang akan menampilkan logging sisi-server pada tab Firebug.

Firebug sendiri juga penting untuk men-debug sisi Javascript dari aplikasi apa pun yang Anda kembangkan. (Dengan asumsi Anda memiliki beberapa kode JS tentu saja).

Saya juga menyukai Django-viewtools untuk debugging tampilan secara interaktif menggunakan pdb, tapi saya tidak menggunakannya sebanyak itu.

Ada alat yang lebih berguna seperti dozer untuk melacak kebocoran memori (ada juga saran bagus lainnya yang diberikan dalam jawaban di SO untuk pelacakan memori).

Van Gale
sumber
65

Saya menggunakan PyCharm (mesin pydev yang sama dengan gerhana). Benar-benar membantu saya secara visual dapat melangkah melalui kode saya dan melihat apa yang terjadi.

PhoebeB
sumber
2
Hal terbaik tentang itu hanya berfungsi dan benar-benar intuitif. Cukup klik di sebelah kiri garis dan tekan tombol debug. Ini berfungsi dengan baik untuk kode sumber Django juga jika Anda ingin mendapatkan pemahaman yang lebih baik tentang cara kerja kode internal. Butuh beberapa saat sebelum saya menyadarinya, tetapi Anda dapat meletakkan breakpoints di salah satu kode di folder Libraries dari navigator file.
Michael Bylstra
6
Patut disebutkan bahwa PyCharm menggunakan debugger PyDev di bawah tenda untuk kredit.
Medeiros
1
stackoverflow.com/a/28256637/4366229
Martin Alexandersson
44

Hampir semuanya telah disebutkan sejauh ini, jadi saya hanya akan menambahkan bahwa alih-alih pdb.set_trace()seseorang dapat menggunakan ipdb.set_trace () yang menggunakan iPython dan karenanya lebih kuat (autocomplete dan barang lainnya). Ini membutuhkan paket ipdb, jadi Anda hanya perlu melakukannyapip install ipdb

Tomasz Zieliński
sumber
2
Saya merekomendasikan pdb ++ yang menyediakan mode lengket yang sangat berguna.
Sandeep
34

Saya sudah mendorong django-pdbke PyPI . Ini adalah aplikasi sederhana yang berarti Anda tidak perlu mengedit kode sumber Anda setiap kali Anda ingin masuk ke pdb.

Instalasi hanya ...

  1. pip install django-pdb
  2. Tambahkan 'django_pdb'keINSTALLED_APPS

Anda sekarang dapat menjalankan: manage.py runserver --pdbuntuk masuk ke pdb di awal setiap tampilan ...

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)

Dan jalankan: manage.py test --pdbuntuk membobol pdb pada kegagalan / kesalahan pengujian ...

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)

Proyek ini dihosting di GitHub , tentu saja kontribusi diterima.

Tom Christie
sumber
3
Ini akan lebih bagus jika Anda dapat menentukan nomor file / baris untuk dihancurkan (bukan hanya tampilan).
Anson MacKeracher
Yang saya bisa tinggalkan dalam kode seperti komentar yang lembam dalam produksi. Mungkin ini adalah paradim yang buruk, tetapi akan bagus untuk secara efektif menanggalkan dan menerapkan jeda waktu.
Gliserin
Saya menginstal ini baru-baru ini, tetapi hanya hari ini menemukan untuk mengkonfigurasi "POST_MORTEM = True" di pengaturan dev saya seperti yang didokumentasikan oleh django-pdb Tom. Sekarang saya bisa berlayar dan ketika keadaan memburuk, saya langsung turun ke lokasi masalahnya. Terima kasih tom!
Joseph Sheedy
21

Cara termudah untuk men-debug python - terutama untuk programer yang digunakan untuk Visual Studio - menggunakan PTVS (Python Tools for Visual Studio). Langkah-langkahnya sederhana:

  1. Unduh dan pasang dari http://pytools.codeplex.com/
  2. Atur breakpoints dan tekan F5.
  3. Breakpoint Anda terkena, Anda dapat melihat / mengubah variabel semudah debugging program C # / C ++.
  4. Itu saja :)

Jika Anda ingin men-debug Django menggunakan PTVS, Anda perlu melakukan hal berikut:

  1. Dalam Pengaturan proyek - tab Umum, atur "File Startup" ke "manage.py", titik masuk program Django.
  2. Di Pengaturan proyek - tab Debug, setel "Argumen Skrip" ke "runserver --noreload". Poin kuncinya adalah "--noreload" di sini. Jika Anda tidak mengaturnya, breakpoints Anda tidak akan terkena.
  3. Bersenang senang lah.
029xue
sumber
1
Terima kasih, itu berhasil. --Noreload adalah yang kami butuhkan
Tom Gruner
Apakah ada fitur untuk debug pada server jauh - mirip dengan Eclipse PyDev yang saya gunakan saat ini?
Daniel Sokolowski
Saya mengalami masalah dengan ini. Saya mengikuti langkah Anda tetapi masih tidak berhasil. Itu hanya berhenti di breakpoints file * .py, bukan yang * .html.
blfuentes
16

Saya menggunakan pyDev dengan Eclipse benar-benar bagus, mengatur titik istirahat, masuk ke kode, melihat nilai pada objek dan variabel, coba.

Gat
sumber
Anda harus menjalankan server dev melalui eclipse (untuk pengalaman debugging yang ringan). PyDev mengklaim memiliki debugging jarak jauh tetapi karena tidak pernah menggunakannya saya tidak dapat berbicara dengan kualitas pengalaman pengembangan. Detail: pydev.org/manual_adv_remote_debugger.html
synthesizerpatel
2
Remote debugger PyDev bekerja sangat baik dengan server dev Django. Pastikan Anda memiliki "Ketika file diubah, modul dimuat ulang secara otomatis?" opsi '' dinonaktifkan '' dalam pengaturan Jalankan / Debug PyDev. Jika tidak, server dev dan pydev akan mencoba memuat ulang kode saat Anda sedang debug, yang membuat keduanya sangat bingung.
coredumperror
12

Saya menggunakan PyCharm dan mendukungnya sepanjang jalan. Harganya sedikit, tetapi saya harus mengatakan bahwa keuntungan yang saya dapatkan tidak ternilai harganya. Saya mencoba debugging dari konsol dan saya memang memberi banyak kredit kepada orang-orang yang bisa melakukan itu, tetapi bagi saya bisa debug secara visual aplikasi saya sangat bagus.

Saya harus mengatakan, PyCharm memang membutuhkan banyak memori. Tetapi sekali lagi, tidak ada hal baik yang gratis dalam hidup. Mereka baru saja datang dengan versi terbaru 3. Mereka juga bermain sangat baik dengan Django, Flask dan Google AppEngine. Jadi, secara keseluruhan, saya akan mengatakan ini adalah alat yang sangat berguna untuk dimiliki oleh pengembang mana pun.

Jika Anda belum menggunakannya, saya akan merekomendasikan untuk mendapatkan versi uji coba selama 30 hari untuk melihat kekuatan PyCharm. Saya yakin ada alat lain juga tersedia, seperti Aptana. Tapi kurasa aku juga suka penampilan PyCharm. Saya merasa sangat nyaman men-debug aplikasi saya di sana.

Khan
sumber
Ini bisa menjadi IDE pertama yang pernah saya beli. Mendebug proyek dalam VM terdengar seperti sihir yang layak dibayar.
Rob Grant
10

Kadang-kadang ketika saya ingin menjelajahi sekitar dalam metode tertentu dan memanggil pdb terlalu rumit, saya akan menambahkan:

import IPython; IPython.embed()

IPython.embed() memulai shell IPython yang memiliki akses ke variabel lokal dari titik di mana Anda menyebutnya.

Lie Ryan
sumber
Saya telah membuat kebiasaan sekarang untuk melakukan ini di bagian atas file from IPython import embeddan kemudian setiap kali saya ingin dengan cepat menambahkan breakpoint dalam kode, saya menulis embed(). Menghemat waktu. Untuk menghindari terjebak dalam loop selamanya, saya lakukanembed();exit();
Mayank Jaiswal
@MayankJaiswal: Saya memiliki pemetaan kunci pada Vim untuk memasukkan potongan ini (dan cuplikan serupa untuk pudbdan debugger;dalam JavaScript) ke dalam file yang saya edit. Setelah saya selesai, saya hanya dd(menghapus seluruh baris) untuk menghapus breakpoint. Ini menghindari risiko melakukan jalur impor debugger ke dalam kontrol versi atau harus mengatur impor terlebih dahulu di bagian atas file.
Lie Ryan
10

Dari perspektif saya, kami dapat memecah tugas debugging kode umum menjadi tiga pola penggunaan yang berbeda:

  1. Sesuatu telah menimbulkan pengecualian : debugger Werkzeug runserver_plus 'untuk menyelamatkan. Kemampuan untuk menjalankan kode khusus di semua level jejak adalah pembunuh. Dan jika Anda benar-benar terjebak, Anda dapat membuat Intisari untuk dibagikan hanya dengan satu klik.
  2. Page diberikan, tetapi hasilnya salah : sekali lagi, batu Werkzeug. Untuk membuat breakpoint dalam kode, ketikkan saja assert Falsetempat yang ingin Anda hentikan.
  3. Kode berfungsi salah , tetapi tampilan cepat tidak membantu. Kemungkinan besar, masalah algoritmik. Mendesah. Lalu aku biasanya jalankan konsol debugger PuDB : import pudb; pudb.set_trace(). Keuntungan utama dari [i] pdb adalah bahwa PuDB (sambil terlihat seperti Anda berusia 80-an) menjadikan pengaturan ekspresi jam tangan khusus menjadi mudah. Dan debugging banyak loop bersarang jauh lebih sederhana dengan GUI.

Ah, ya, kesengsaraan templat. Masalah yang paling umum (untuk saya dan kolega saya) adalah konteks yang salah: apakah Anda tidak memiliki variabel, atau variabel Anda tidak memiliki beberapa atribut. Jika Anda menggunakan bilah alat debug , cukup periksa konteks di bagian "Templat", atau, jika tidak mencukupi, atur jeda dalam kode tampilan Anda tepat setelah konteks Anda diisi.

Begitu seterusnya.

Alex Morozov
sumber
ketik kurang menggunakan hanyaimport pudb;pu.db
Sławomir Lenart
6

Saya sangat merekomendasikan epdb (Extended Python Debugger).

https://bitbucket.org/dugan/epdb

Satu hal yang saya sukai dari epdb untuk debugging Django atau webserver Python lainnya adalah perintah epdb.serve (). Ini menetapkan jejak dan menyajikannya pada port lokal yang dapat Anda sambungkan. Kasus penggunaan umum:

Saya memiliki pandangan bahwa saya ingin melalui langkah-demi-langkah. Saya akan memasukkan yang berikut pada titik saya ingin mengatur jejak.

import epdb; epdb.serve()

Setelah kode ini dieksekusi, saya membuka juru bahasa Python dan terhubung ke instance penyajian. Saya dapat menganalisis semua nilai dan melangkah melalui kode menggunakan perintah pdb standar seperti n, s, dll.

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

Dan banyak lagi yang bisa Anda pelajari tentang mengetik bantuan epdb kapan saja.

Jika Anda ingin melayani atau terhubung ke beberapa instance epdb secara bersamaan, Anda dapat menentukan porta untuk didengarkan (defaultnya adalah 8080). Yaitu

import epdb; epdb.serve(4242)

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

host default ke 'localhost' jika tidak ditentukan. Saya melemparkannya ke sini untuk menunjukkan bagaimana Anda dapat menggunakan ini untuk men-debug sesuatu selain dari instance lokal, seperti server pengembangan di LAN lokal Anda. Jelas, jika Anda melakukan ini berhati-hatilah bahwa jejak yang ditetapkan tidak pernah berhasil masuk ke server produksi Anda!

Sebagai catatan singkat, Anda masih bisa melakukan hal yang sama dengan jawaban yang diterima dengan epdb ( import epdb; epdb.set_trace()) tapi saya ingin menyoroti fungsi servis karena saya merasa sangat berguna.

Jacinda
sumber
epdb tidak diperbarui sejak 2011. Apakah Anda pernah mengalami masalah menggunakannya pada versi Django dan / atau Python yang lebih baru?
Seperman
Saya tidak pernah mengalami masalah dalam menggunakannya melawan Python 2 (khusus 2.4-2.7). Saya menggunakannya hanya beberapa hari yang lalu, sebenarnya. Saya belum pernah mencoba dengan Python 3.
Jacinda
1
Saya menjalankan django 1.8 di python 2.7 dan saya tidak bisa mendapatkan epdb.connect untuk berbicara dengan epdb.serve. Saya baru saja mendapat batas waktu.
David Watson
6

Saya baru saja menemukan wdb ( http://www.rkblog.rk.edu.pl/w/p/debugging-python-code-browser-wdb-debugger/?goback=%2Egde_25827_member_255996401 ). Ini memiliki antarmuka pengguna yang cukup bagus / GUI dengan semua lonceng dan peluit. Penulis mengatakan ini tentang wdb -

"Ada IDE seperti PyCharm yang memiliki debugger sendiri. Mereka menawarkan serangkaian fitur yang sama atau setara ... Namun untuk menggunakannya Anda harus menggunakan IDE spesifik itu (dan beberapa di antaranya tidak bebas atau mungkin tidak tersedia untuk semua platform). Pilih alat yang tepat untuk kebutuhan Anda. "

Kupikir aku baru saja meneruskannya.

Juga artikel yang sangat membantu tentang debugger python: https://zapier.com/engineering/debugging-python-boss/

Akhirnya , jika Anda ingin melihat cetakan grafis yang bagus dari tumpukan panggilan Anda di Django, checkout: https://github.com/joerick/pyinstrument . Cukup tambahkan pyinstrument.middleware.ProfilerMiddleware ke MIDDLEWARE_CLASSES, lalu tambahkan profil ke akhir URL permintaan untuk mengaktifkan profiler.

Juga dapat menjalankan pyinstrument dari baris perintah atau dengan mengimpor sebagai modul.

Kandang kelinci
sumber
PyCharm hanya menggunakan PyDev, saya pikir, bukan yang itu sendiri.
Rob Grant
6

Tambahkan import pdb; pdb.set_trace()atau breakpoint() (bentuk python3.7) pada baris yang sesuai dalam kode Python dan jalankan. Eksekusi akan berhenti dengan shell interaktif. Dalam shell Anda dapat menjalankan kode Python (yaitu variabel cetak) atau menggunakan perintah seperti:

  • c melanjutkan eksekusi
  • n langkah ke baris berikutnya dalam fungsi yang sama
  • s langkah ke baris berikutnya dalam fungsi ini atau fungsi yang disebut
  • q keluar dari debugger / eksekusi

Juga lihat: https://poweruser.blog/setting-a-breakpoint-in-python-438e23fe6b28

Chris
sumber
5

Salah satu opsi terbaik Anda untuk men-debug kode Django adalah melalui wdb: https://github.com/Kozea/wdb

wdb bekerja dengan python 2 (2.6, 2.7), python 3 (3.2, 3.3, 3.4, 3.5) dan pypy. Lebih baik lagi, adalah mungkin untuk men-debug program python 2 dengan server wdb berjalan pada python 3 dan sebaliknya atau men-debug program yang berjalan di komputer dengan server debug yang berjalan di komputer lain di dalam halaman web di komputer ketiga! Lebih baik lagi, sekarang dimungkinkan untuk menghentikan proses / utas python yang sedang berjalan menggunakan injeksi kode dari antarmuka web. (Ini membutuhkan gdb dan ptrace diaktifkan) Dengan kata lain itu adalah versi pdb yang sangat ditingkatkan secara langsung di browser Anda dengan fitur yang bagus.

Instal dan jalankan server, dan dalam kode Anda tambahkan:

import wdb
wdb.set_trace()

Menurut penulis, perbedaan utama sehubungan dengan pdbadalah:

Bagi mereka yang tidak tahu proyeknya, wdb adalah debugger python seperti pdb, tetapi dengan web front-end yang apik dan banyak fitur tambahan, seperti:

  • Penyorotan sintaksis sumber
  • Breakpoints visual
  • Penyelesaian kode interaktif menggunakan jedi
  • Breakpoint persisten
  • Inspeksi objek yang mendalam menggunakan dukungan mouse Multithreading / Multiprocessing
  • Debugging jarak jauh
  • Tonton ekspresi
  • Dalam edisi kode debugger
  • Integrasi server web populer untuk memecahkan kesalahan
  • Dalam pengecualian melanggar selama pelacakan (bukan post-mortem) bertentangan dengan debugger werkzeug misalnya
  • Membobol program yang sedang berjalan melalui injeksi kode (pada sistem yang didukung)

Ini memiliki antarmuka pengguna berbasis browser yang hebat. Sukacita untuk digunakan! :)

fessacchiotto
sumber
Apa bedanya dengan pdb?
Dunatotatos
4

Saya menggunakan PyCharm dan alat debug yang berbeda. Juga memiliki artikel bagus mengatur tentang mudah mengatur hal-hal itu untuk pemula Anda bisa mulai di sini. Ini menceritakan tentang debugging PDB dan GUI secara umum dengan proyek Django. Semoga seseorang akan mendapat manfaat dari mereka.

garmoncheg
sumber
2

Sebagian besar opsi sudah disebutkan. Untuk mencetak konteks templat, saya telah membuat perpustakaan sederhana untuk itu. Lihat https://github.com/edoburu/django-debugtools

Anda dapat menggunakannya untuk mencetak konteks templat tanpa {% load %}konstruk apa pun :

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

Ini menggunakan format cetak kustom untuk menampilkan variabel dalam <pre>tag.

vdboor
sumber
2

Saya menemukan Visual Studio Code luar biasa untuk debugging aplikasi Django. Parameter python launch.json standar berjalan python manage.pydengan debugger terpasang, sehingga Anda dapat mengatur breakpoint dan melangkah melalui kode Anda sesuka Anda.

Nuh MacCallum
sumber
2

Bagi mereka yang secara tidak sengaja dapat menambahkan pdb ke dalam live commit, saya dapat menyarankan ekstensi #Koobz ini sebagai jawaban:

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

Dari pengalaman saya sendiri, ada dua cara:

  1. gunakan ipdb , yang merupakan debugger yang disempurnakan suka pdb.

    import ipdb;ipdb.set_trace()atau breakpoint() (dari python3.7)

  2. gunakan django shell, cukup gunakan perintah di bawah ini. Ini sangat membantu ketika Anda sedang mengembangkan pandangan baru.

    python manage.py shell

Mark White
sumber
1

Seperti disebutkan dalam posting lain di sini - mengatur breakpoint dalam kode Anda dan berjalan melalui kode untuk melihat apakah itu berperilaku seperti yang Anda harapkan adalah cara yang bagus untuk mempelajari sesuatu seperti Django sampai Anda memiliki perasaan yang baik tentang bagaimana semua itu berperilaku - dan apa kode Anda sedang melakukan.

Untuk melakukan ini, saya akan merekomendasikan menggunakan WingIde. Sama seperti IDE lain yang disebutkan bagus dan mudah digunakan, tata letak yang bagus dan juga mudah untuk mengatur breakpoints mengevaluasi / memodifikasi stack dll. Sempurna untuk memvisualisasikan apa yang kode Anda lakukan saat Anda melangkah melaluinya. Saya penggemar beratnya.

Saya juga menggunakan PyCharm - ini memiliki analisis kode statis yang sangat baik dan kadang-kadang dapat membantu menemukan masalah sebelum Anda menyadari bahwa mereka ada di sana.

Seperti disebutkan sudah django-debug-toolbar sangat penting - https://github.com/django-debug-toolbar/django-debug-toolbar

Dan meskipun tidak secara eksplisit alat debug atau analisis - salah satu favorit saya adalah SQL Printing Middleware yang tersedia dari Django Snippets di https://djangosnippets.org/snippets/290/

Ini akan menampilkan kueri SQL yang dibuat oleh tampilan Anda. Ini akan memberi Anda pemahaman yang baik tentang apa yang dilakukan ORM dan jika pertanyaan Anda efisien atau Anda perlu mengerjakan ulang kode Anda (atau menambahkan caching).

Saya merasa sangat berharga untuk mengawasi kinerja permintaan saat mengembangkan dan men-debug aplikasi saya.

Hanya satu tip lain - saya memodifikasinya sedikit untuk saya gunakan sendiri untuk hanya menampilkan ringkasan dan bukan pernyataan SQL .... Jadi saya selalu menggunakannya saat mengembangkan dan menguji. Saya juga menambahkan bahwa jika len (connection.queries) lebih besar dari ambang yang ditentukan sebelumnya akan menampilkan peringatan tambahan.

Kemudian jika saya melihat sesuatu yang buruk (dari kinerja atau sejumlah perspektif permintaan) terjadi saya kembali pada tampilan penuh pernyataan SQL untuk melihat apa yang sebenarnya terjadi. Sangat berguna ketika Anda mengerjakan proyek Django besar dengan banyak pengembang.

IanH
sumber
1

gunakan pdbatau ipdb. Perbedaan antara keduanya adalah dukungan ipdb otomatis lengkap.

untuk pdb

import pdb
pdb.set_trace()

untuk ipdb

import ipdb
ipdb.set_trace()

Untuk menjalankan ntombol tekan baris baru , untuk melanjutkan tekan ctombol. periksa lebih banyak opsi dengan menggunakanhelp(pdb)

Abdul Gaffar
sumber
0

Saran tambahan.

Anda dapat memanfaatkan nosetests dan pdb secara bersamaan, alih-alih menyuntikkan pdb.set_trace()dalam pandangan Anda secara manual. Keuntungannya adalah Anda dapat mengamati kondisi kesalahan saat pertama kali dimulai, berpotensi dalam kode pihak ketiga.

Ini kesalahan untuk saya hari ini.

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 %}

Sekarang, saya tahu ini berarti bahwa saya menyia-nyiakan konstruktor untuk formulir, dan saya bahkan punya ide bagus tentang bidang mana yang menjadi masalah. Tapi, bisakah saya menggunakan pdb untuk melihat bentuk renyah apa yang dikeluhkan, di dalam templat ?

Ya saya bisa. Menggunakan opsi --pdb di nosetests:

tests$ nosetests test_urls_catalog.py --pdb

Segera setelah saya menemukan pengecualian (termasuk yang ditangani dengan anggun), pdb berhenti di tempat itu terjadi dan saya bisa melihat-lihat.

  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)         

Sekarang, sudah jelas bahwa argumen pilihan saya ke konstruktor bidang renyah adalah seperti daftar di dalam daftar, bukan daftar / tupel tupel.

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

Yang rapi adalah pdb ini terjadi di dalam kode crispy, bukan milikku dan aku tidak perlu memasukkannya secara manual.

JL Peyret
sumber
0

Selama pengembangan, menambahkan quick

assert False, value

dapat membantu mendiagnosis masalah dalam tampilan atau tempat lain, tanpa perlu menggunakan debugger.

Udi
sumber