วิธีการใช้ django 3.0 ORM ใน Jupyter Notebook โดยไม่ทริกเกอร์การตรวจสอบบริบทของ async?


24

Django 3.0 คือการเพิ่มasgi สนับสนุน / async และด้วยยามรอบทำให้การร้องขอการซิงโครในบริบท ขณะเดียวกันIPython เพิ่งเพิ่มระดับบนสุด async สนับสนุน / รอคอยซึ่งดูเหมือนว่าจะทำงานภายในเซสชั่นล่ามทั้งห่วงเหตุการณ์เริ่มต้น

น่าเสียดายที่การรวมกันของการเพิ่มที่ยอดเยี่ยมทั้งสองนี้หมายความว่าการดำเนินการ django ORM ในสมุดบันทึก jupyter ทำให้เกิดSynchronousOnlyOperationข้อยกเว้น:

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

ดังที่ข้อความแสดงข้อยกเว้นบอกว่าเป็นไปได้ที่จะรวมการเรียก ORM แต่ละครั้งในลักษณะที่sync_to_async()คล้ายกัน:

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

แต่ไม่สะดวกโดยเฉพาะอย่างยิ่งสำหรับฟิลด์ที่เกี่ยวข้องซึ่งโดยปกติจะได้รับการแก้ไขโดยปริยายในการค้นหาแอตทริบิวต์

(ฉันลอง%autoawait offใช้เวทย์มนตร์ แต่มันใช้งานไม่ได้จากการมองอย่างรวดเร็วที่เอกสารฉันคิดว่าเป็นเพราะ ipykernels มักจะทำงานในลูป asyncio)

ดังนั้นมีวิธีการอย่างใดอย่างหนึ่งปิดการซิงค์ในบริบทการตรวจสอบ async ใน django หรือเรียกใช้ ipykernel ในบริบทซิงโครนัส?


สำหรับบริบท: ฉันเขียนแพ็กเกจวิทยาศาสตร์ข้อมูลที่ใช้ django เป็นเซิร์ฟเวอร์แบ็กเอนด์ แต่ยังเปิดเผยอินเตอร์เฟส jupyter ที่อยู่ด้านบนของ ORM ที่ช่วยให้คุณสามารถล้างข้อมูล / ใส่คำอธิบายประกอบติดตามการเรียนรู้ของเครื่องติดตามและฝึกอบรมงานทั้งหมดในสมุดบันทึก jupyter .

คำตอบ:


18

มันใช้งานได้สำหรับฉัน

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

BTW ฉันเริ่มโน๊ตบุ๊คโดยใช้คำสั่ง

./manage.py shell_plus --notebook

หวังว่ามันจะช่วย


ฉันได้ลองสิ่งนี้แล้ว มันยังคงแสดงข้อผิดพลาดในจูปีเตอร์ ฉันควรจะใส่os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"ที่ไหน ฉันลองใช้ jupyter และเพิ่มไปที่ settings.py แต่กระนั้น jupyter ของฉันก็กำลังผิดพลาด
Santhosh Yedidi

2
ฉันใส่ไว้ในสมุดบันทึก
Wojtas Koziej

@michalwols คำตอบสำหรับฉัน
Santhosh Yedidi

@ SandoshYedidi ทำมันใน CLI เอ็กซ์พอร์ตตัวแปรก่อนรันเซิร์ฟเวอร์ jupyter
Siddharth Pant

ทำงานให้ฉันด้วย เพียงเพิ่มลงใน settings.py และเรียกใช้ shell_plus บนโน้ตบุ๊ก
Shekhar

6

สำหรับตอนนี้ผมวางแผนที่จะเพียงแค่ใช้รุ่นคดเคี้ยวของ Django กับการตั้งค่าใหม่ที่จะข้ามการตรวจสอบ เมื่อ ORM ได้รับการสนับสนุนแบบอะซิงก์ฉันอาจต้องเขียนโปรเจ็กต์ของฉันใหม่เพื่อสนับสนุนและปล่อยแฟล็ก

แก้ไข: ตอนนี้มี PR เพื่อเพิ่มตัวแปร env ( DJANGO_ALLOW_ASYNC_UNSAFE) เพื่อปิดการใช้งานการตรวจสอบ ( https://github.com/django/django/pull/12172 )


ขณะนี้การเปลี่ยนแปลงนี้มีกำหนดการ3.0.1
Sayse

วิธีนี้ใช้ได้ผลสำหรับฉัน ขอบคุณ
Santhosh Yedidi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.