Bagaimana cara menggunakan django 3.0 ORM dalam Notebook Jupyter tanpa memicu pemeriksaan konteks async?

24

Django 3.0 menambahkan dukungan asgi / async dan dengan itu menjaga sekitar membuat permintaan sinkron dalam konteks async . Bersamaan dengan itu, IPython baru saja menambahkan dukungan async / menunggu tingkat atas , yang tampaknya menjalankan seluruh sesi juru bahasa di dalam perulangan acara standar.

Sayangnya kombinasi dari kedua tambahan yang hebat ini berarti bahwa setiap operasi ORM django di notebook jupyter menyebabkan SynchronousOnlyOperationpengecualian:

SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.

Seperti yang dikatakan pesan pengecualian, mungkin untuk membungkus setiap panggilan ORM dalam sync_to_async()seperti:

images = await sync_to_async(Image.objects.all)()

tapi itu tidak terlalu nyaman, terutama untuk bidang terkait yang biasanya diselesaikan secara implisit pada pencarian atribut.

(Saya mencoba %autoawait offsihir tetapi tidak berhasil, dari pandangan cepat ke dokumen saya berasumsi itu karena ipykernels selalu berjalan dalam loop asyncio)

Jadi apakah ada cara untuk menonaktifkan sinkronisasi di async context check di Django atau menjalankan ipykernel dalam konteks sinkron?


Untuk konteks: Saya menulis paket sains data yang menggunakan Django sebagai server backend tetapi juga memperlihatkan antarmuka berbasis jupyter di atas ORM yang memungkinkan Anda untuk membersihkan / membubuhi keterangan data, melacak eksperimen pembelajaran mesin dan menjalankan pekerjaan pelatihan di notebook jupyter .

michalwols
sumber

Jawaban:

18

Ini bekerja untuk saya

os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"

BTW, saya memulai notebook saya menggunakan perintah

./manage.py shell_plus --notebook

Semoga ini bisa membantu

Wojtas Koziej
sumber
Saya sudah mencoba ini. masih menunjukkan kesalahan dalam jupyter. Di mana saya harus meletakkan os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true". Saya mencoba di dalam jupyter dan juga menambahkan ke settings.py. Tapi tetap saja jupyter saya memberikan kesalahan
Santhosh Yedidi
2
Saya memasukkannya ke dalam buku catatan
Wojtas Koziej
Jawaban @michalwols bekerja untuk saya
Santhosh Yedidi
@SanthoshYedidi melakukannya di cli. Ekspor variabel sebelum menjalankan server jupyter.
Siddharth Pant
bekerja untuk saya juga. tambahkan saja ke settings.py dan jalankan shell_plus di notebook
Shekhar
6

Untuk saat ini saya berencana hanya menggunakan versi django bercabang dua dengan pengaturan baru untuk melewati pemeriksaan async_unsafe . Setelah ORM mendapatkan dukungan async saya mungkin harus menulis ulang proyek saya untuk mendukungnya dan menjatuhkan flag.

EDIT: sekarang ada PR untuk menambahkan variabel env ( DJANGO_ALLOW_ASYNC_UNSAFE) untuk menonaktifkan cek ( https://github.com/django/django/pull/12172 )

michalwols
sumber
Perubahan ini sekarang dijadwalkan untuk 3.0.1
Sayse
Solusi ini berhasil untuk saya. terima kasih
Santhosh Yedidi