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 .
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
ที่ไหน ฉันลองใช้ jupyter และเพิ่มไปที่ settings.py แต่กระนั้น jupyter ของฉันก็กำลังผิดพลาด