Saya bekerja dengan Django dan menggunakan Django shell sepanjang waktu. Bagian yang mengganggu adalah sementara server Django memuat ulang pada perubahan kode, shell tidak, jadi setiap kali saya membuat perubahan ke metode yang saya uji, saya perlu keluar dari shell dan memulai ulang, mengimpor ulang semua modul yang saya perlu, menginisialisasi ulang semua variabel yang saya butuhkan, dll. Meskipun riwayat iPython menghemat banyak pengetikan, ini masih menyebalkan. Apakah ada cara untuk membuat django shell auto-reload, seperti yang dilakukan oleh server pengembangan django?
Saya tahu tentang reload (), tetapi saya mengimpor banyak model dan umumnya menggunakan from app.models import *
sintaks, jadi reload () tidak banyak membantu.
Jawaban:
Saya merekomendasikan menggunakan proyek ekstensi-django seperti yang disebutkan di atas oleh dongweiming. Tetapi alih-alih hanya perintah manajemen 'shell_plus', gunakan:
Ini akan membuka notebook IPython di browser web Anda. Tulis kode Anda di sana di sel, impor Anda, dll. Dan jalankan.
Ketika Anda mengubah modul Anda, cukup klik item menu notebook 'Kernel-> Restart'
Ini dia, kode Anda sekarang menggunakan modul yang telah Anda modifikasi.
sumber
Saya sarankan menggunakan ekstensi autoreload IPython .
./manage.py shell In [1]: %load_ext autoreload In [2]: %autoreload 2
Dan mulai sekarang semua modul yang diimpor akan disegarkan sebelum dievaluasi.
In [3]: from x import print_something In [4]: print_something() Out[4]: 'Something' # Do changes in print_something method in x.py file. In [5]: print_something() Out[5]: 'Something else'
Bekerja juga jika ada sesuatu yang diimpor sebelum
%load_ext autoreload
perintah../manage.py shell In [1]: from x import print_something In [2]: print_something() Out[2]: 'Something' # Do changes in print_something method in x.py file. In [3]: %load_ext autoreload In [4]: %autoreload 2 In [5]: print_something() Out[5]: 'Something else'
Ada juga kemungkinan mencegah beberapa impor dari
%aimport
refresh dengan perintah dan 3 strategi autoreload:Ini biasanya berfungsi baik untuk saya gunakan, tetapi ada beberapa cavetas:
sumber
/manage.py shell_plus
... jika Anda mengetik%load_ext autoreload
dan kemudian%autoreload 2
, model akan dimuat ulang secara otomatis.lihat perintah manage.py shell_plus yang disediakan oleh proyek django-extensions . Ini akan memuat semua file model Anda pada startup shell. dan autoreload apapun yang anda modifikasi tapi tidak perlu keluar, anda bisa langsung menelpon kesana
sumber
Solusi saya untuk itu adalah saya menulis kode dan menyimpan ke file dan kemudian menggunakan:
Jadi saya bisa melakukan perubahan, menyimpan dan menjalankan perintah itu lagi sampai saya memperbaiki apa pun yang saya coba perbaiki.
sumber
exit()
ke bagian bawah file py untuk keluar dari shell Django dengan cara yang lebih bersih. Terima kasih.Tampaknya konsensus umum tentang topik ini, adalah bahwa python reload () menyebalkan dan tidak ada cara yang baik untuk melakukan ini.
sumber
Reload () tidak bekerja pada shell Django tanpa beberapa trik. Anda dapat memeriksa utas ini na dan jawaban saya secara khusus:
Bagaimana Anda memuat ulang modul model Django menggunakan interpreter interaktif melalui "manage.py shell"?
sumber
Solusi saya untuk ketidaknyamanan ini berikut. Saya menggunakan IPython.
$ ./manage.py shell > import myapp.models as mdls # 'mdls' or whatever you want, but short... > mdls.SomeModel.objects.get(pk=100) > # At this point save some changes in the model > reload(mdls) > mdls.SomeModel.objects.get(pk=100)
Untuk Python 3.x , 'reload' harus diimpor menggunakan:
from importlib import reload
Semoga membantu. Tentu saja ini untuk tujuan debug.
Bersulang.
sumber
Gunakan shell_plus dengan konfigurasi ipython. Ini akan memungkinkan
autoreload
sebelum shell_plus mengimpor apapun secara otomatis.Edit profil ipython Anda (
~/.ipython/profile_default/ipython_config.py
):c.InteractiveShellApp.exec_lines = ['%autoreload 2'] c.InteractiveShellApp.extensions = ['autoreload']
Buka shell - perhatikan bahwa Anda tidak perlu menyertakan
--ipython
:Sekarang apapun yang didefinisikan di
SHELL_PLUS_PRE_IMPORTS
atauSHELL_PLUS_POST_IMPORTS
( docs ) akan dimuat secara otomatis!Perhatikan bahwa jika shell Anda berada di debugger (ex
pdb.set_trace()
) saat Anda menyimpan file, hal itu dapat mengganggu pemuatan ulang.sumber
Alih-alih menjalankan perintah dari shell Django, Anda dapat menyetel perintah manajemen seperti itu dan menjalankannya kembali setiap saat.
sumber
Tidak persis seperti yang Anda inginkan, tetapi sekarang saya cenderung membuat sendiri perintah manajemen untuk menguji dan mengotak-atik berbagai hal.
Dalam perintah, Anda dapat mengatur sekelompok penduduk setempat seperti yang Anda inginkan dan kemudian masuk ke shell interaktif.
import code class Command(BaseCommand): def handle(self, *args, **kwargs): foo = 'bar' code.interact(local=locals())
Tanpa memuat ulang, tetapi cara yang mudah dan tidak terlalu mengganggu untuk menguji fungsionalitas django secara interaktif.
sumber