如何在Jupyter Notebook中使用django 3.0 ORM而不触发异步上下文检查?


24

Django 3.0增加了asgi / async支持,并提供了在异步上下文中发出同步请求的保护措施。同时,IPython刚刚添加了顶级的async / await支持,它似乎在默认事件循环内运行整个解释器会话。

不幸的是,这两个大加法的结合意味着jupyter笔记本中的任何django ORM操作都会导致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循环中运行)

那么有没有办法在Django中禁用异步上下文检查中的同步或在同步上下文中运行ipykernel?


对于上下文:我编写了一个数据科学软件包,该软件包使用django作为后端服务器,但还在ORM上公开了基于jupyter的界面,该界面允许您在jupyter笔记本中清理/注释数据,跟踪机器学习实验并运行培训作业。

Answers:


18

这个对我有用

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

顺便说一句,我使用以下命令启动笔记本

./manage.py shell_plus --notebook

希望能帮助到你


我已经试过了。它仍然在jupyter中显示错误。我应该放在哪里os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"。我在jupyter内部尝试过,还添加到settings.py中。但是我的jupyter还是在给错误
Santhosh Yedidi

2
我把它放在笔记本中
Wojtas Koziej

@michalwols答案为我工作
Santhosh Yedidi

@SanthoshYedidi在cli中进行操作。在运行jupyter服务器之前,请导出变量。
Siddharth裤子

也为我工作。只需将其添加到settings.py并在笔记本上运行shell_plus
Shekhar

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.