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?
Jawaban:
Ada banyak cara untuk melakukannya, tetapi yang paling mudah adalah dengan menggunakan debugger Python . Cukup tambahkan baris berikut ke fungsi tampilan Django:
atau
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):
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 .
sumber
manage.py runserver --pdb
danmanage.py test --pdb
perintah.ipython
juga.Ipdb
, yang datang denganipython
, fitur penyelesaian tab, sintaks berwarna, dan banyak lagi :-).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_plus
perintah 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.
sumber
python 3.3
Quickie kecil untuk tag templat:
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 memeriksaelement
isi hati Anda.Ini cara yang sangat bagus untuk melihat apa yang terjadi pada objek Anda ketika tiba di templat.
sumber
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).
sumber
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.
sumber
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
sumber
Saya sudah mendorong
django-pdb
ke PyPI . Ini adalah aplikasi sederhana yang berarti Anda tidak perlu mengedit kode sumber Anda setiap kali Anda ingin masuk ke pdb.Instalasi hanya ...
pip install django-pdb
'django_pdb'
keINSTALLED_APPS
Anda sekarang dapat menjalankan:
manage.py runserver --pdb
untuk masuk ke pdb di awal setiap tampilan ...Dan jalankan:
manage.py test --pdb
untuk membobol pdb pada kegagalan / kesalahan pengujian ...Proyek ini dihosting di GitHub , tentu saja kontribusi diterima.
sumber
Cara termudah untuk men-debug python - terutama untuk programer yang digunakan untuk Visual Studio - menggunakan PTVS (Python Tools for Visual Studio). Langkah-langkahnya sederhana:
Jika Anda ingin men-debug Django menggunakan PTVS, Anda perlu melakukan hal berikut:
sumber
Saya menggunakan pyDev dengan Eclipse benar-benar bagus, mengatur titik istirahat, masuk ke kode, melihat nilai pada objek dan variabel, coba.
sumber
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.
sumber
Kadang-kadang ketika saya ingin menjelajahi sekitar dalam metode tertentu dan memanggil pdb terlalu rumit, saya akan menambahkan:
IPython.embed()
memulai shell IPython yang memiliki akses ke variabel lokal dari titik di mana Anda menyebutnya.sumber
from IPython import embed
dan kemudian setiap kali saya ingin dengan cepat menambahkan breakpoint dalam kode, saya menulisembed()
. Menghemat waktu. Untuk menghindari terjebak dalam loop selamanya, saya lakukanembed();exit();
pudb
dandebugger;
dalam JavaScript) ke dalam file yang saya edit. Setelah saya selesai, saya hanyadd
(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.Dari perspektif saya, kami dapat memecah tugas debugging kode umum menjadi tiga pola penggunaan yang berbeda:
assert False
tempat yang ingin Anda hentikan.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.
sumber
import pudb;pu.db
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.
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.
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
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.sumber
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.
sumber
Tambahkan
import pdb; pdb.set_trace()
ataubreakpoint()
(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 eksekusin
langkah ke baris berikutnya dalam fungsi yang samas
langkah ke baris berikutnya dalam fungsi ini atau fungsi yang disebutq
keluar dari debugger / eksekusiJuga lihat: https://poweruser.blog/setting-a-breakpoint-in-python-438e23fe6b28
sumber
Salah satu opsi terbaik Anda untuk men-debug kode Django adalah melalui wdb: https://github.com/Kozea/wdb
Instal dan jalankan server, dan dalam kode Anda tambahkan:
Menurut penulis, perbedaan utama sehubungan dengan
pdb
adalah:Ini memiliki antarmuka pengguna berbasis browser yang hebat. Sukacita untuk digunakan! :)
sumber
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.
sumber
Jika menggunakan Aptana untuk pengembangan Django, tonton ini: http://www.youtube.com/watch?v=qQh-UQFltJQ
Jika tidak, pertimbangkan untuk menggunakannya.
sumber
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 :Ini menggunakan format cetak kustom untuk menampilkan variabel dalam
<pre>
tag.sumber
Saya menemukan Visual Studio Code luar biasa untuk debugging aplikasi Django. Parameter python launch.json standar berjalan
python manage.py
dengan debugger terpasang, sehingga Anda dapat mengatur breakpoint dan melangkah melalui kode Anda sesuka Anda.sumber
Bagi mereka yang secara tidak sengaja dapat menambahkan pdb ke dalam live commit, saya dapat menyarankan ekstensi #Koobz ini sebagai jawaban:
sumber
Dari pengalaman saya sendiri, ada dua cara:
gunakan ipdb , yang merupakan debugger yang disempurnakan suka pdb.
import ipdb;ipdb.set_trace()
ataubreakpoint()
(dari python3.7)gunakan django shell, cukup gunakan perintah di bawah ini. Ini sangat membantu ketika Anda sedang mengembangkan pandangan baru.
python manage.py shell
sumber
Saya sangat menyarankan untuk menggunakan PDB.
Anda dapat memeriksa semua nilai variabel, masuk ke fungsi dan banyak lagi. https://docs.python.org/2/library/pdb.html
untuk memeriksa semua jenis permintaan, respons, dan hits ke database. Saya menggunakan django-debug-toolbar https://github.com/django-debug-toolbar/django-debug-toolbar
sumber
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.
sumber
gunakan
pdb
atauipdb
. Perbedaan antara keduanya adalah dukungan ipdb otomatis lengkap.untuk pdb
untuk ipdb
Untuk menjalankan
n
tombol tekan baris baru , untuk melanjutkan tekanc
tombol. periksa lebih banyak opsi dengan menggunakanhelp(pdb)
sumber
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.
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.
Sekarang, sudah jelas bahwa argumen pilihan saya ke konstruktor bidang renyah adalah seperti daftar di dalam daftar, bukan daftar / tupel tupel.
Yang rapi adalah pdb ini terjadi di dalam kode crispy, bukan milikku dan aku tidak perlu memasukkannya secara manual.
sumber
Selama pengembangan, menambahkan quick
dapat membantu mendiagnosis masalah dalam tampilan atau tempat lain, tanpa perlu menggunakan debugger.
sumber