Django 3.0 ORM'yi, zamanuyumsuz içerik denetimini tetiklemeden bir Jupyter Notebook'da nasıl kullanabilirim?


24

Django 3.0, asgi / async desteği ekliyor ve bununla birlikte bir async bağlamında senkronize istekleri yapmak için bir güvenlik görevlisi . Eşzamanlı olarak, IPython , tüm yorumlayıcı oturumunu varsayılan bir olay döngüsü içinde çalıştırıyor gibi görünen en üst düzey asenkron / bekliyor desteğini ekledi .

Ne yazık ki bu iki büyük eklemenin birleşimi, bir jupyter dizüstü bilgisayardaki herhangi bir django ORM işleminin bir istisnaya neden olduğu anlamına gelir SynchronousOnlyOperation:

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

İstisna mesajında ​​belirtildiği gibi, her ORM çağrısını sync_to_async()benzer bir şekilde sarmak mümkündür :

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

ancak özellikle özellik aramasında örtük olarak çözülecek ilgili alanlar için çok uygun değildir.

( %autoawait offSihir denedim ama işe yaramadı , dokümanlardaki hızlı bir bakıştan, ipykernels'in her zaman bir asyncio döngüsünde çalıştığı için varsayıyorum)

Django'da eşzamansız bağlam denetiminde senkronizasyonu devre dışı bırakmanın veya eşzamanlı bağlamda bir ipykernel çalıştırmanın bir yolu var mı?


Bağlam için: django'yu arka uç sunucusu olarak kullanan ancak aynı zamanda ORM'nin üzerine verileri temizlemenize / açıklama eklemenize, makine öğrenme deneylerini izlemenize ve eğitim işlerini bir jupyter not defterinde çalıştırmanıza izin veren bir jupyter tabanlı arayüz ortaya koyan bir veri bilimi paketi yazdım. .

Yanıtlar:


18

Benim için çalışıyor

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

BTW, dizüstü bilgisayarımı şu komutu kullanarak başlatıyorum

./manage.py shell_plus --notebook

Umarım yardımcı olur


Bunu denedim. hala jupyter'da hatayı gösterir. Nereye koymalıyım os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true". Jupyter içinde denedim ve settings.py'ye de ekledim. BU hala benim jupyter hata veriyor
Santhosh Yedidi

2

@michalwols cevap benim için çalıştı
Santhosh Yedidi

@SanthoshYedidi bunu uçurumda yap. Değişkeni, jupyter sunucusunu çalıştırmadan önce dışa aktarın.
Siddharth Pant

benim için de çalıştı. sadece settings.py'ye ekleyin ve dizüstü bilgisayarda shell_plus'ı çalıştırın
Shekhar

6

Şimdilik sadece async_unsafe kontrolünü atlamak için yeni bir ayar ile django'nun çatallı versiyonunu kullanmayı planlıyorum . ORM zaman uyumsuz destek aldıktan sonra, muhtemelen projemi desteklemek ve bayrağı bırakmak için yeniden yazmam gerekecek.

DÜZENLEME: artık DJANGO_ALLOW_ASYNC_UNSAFEdenetimi devre dışı bırakmak için bir env değişkeni ( ) eklemek için bir PR var ( https://github.com/django/django/pull/12172 )


Bu değişiklik artık 3.0.1
Sayse

Bu çözüm benim için çalıştı. teşekkürler
Santhosh Yedidi
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.