45

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

不幸的是,这两个伟大的补充的组合意味着 jupyter notebook 中的任何 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 notebook 中清理/注释数据、跟踪机器学习实验和运行训练作业.

4

4 回答 4

47

这个对我有用

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

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

./manage.py shell_plus --notebook
于 2020-01-16T16:29:04.257 回答
8

与其他答案相反,我建议从 shell 运行:

env DJANGO_ALLOW_ASYNC_UNSAFE=true ./manage.py shell_plus --notebook

并且不修改任何配置文件或启动脚本。

这样做的好处是这些检查似乎仍然有用,几乎在其他任何地方都启用了(例如,当通过本地调试runserver或运行测试时)。通过文件禁用很容易在太多地方禁用它们,从而否定它们的优势。

请注意,大多数 shell 提供了调用先前调用的命令行的简单方法,例如在 Bash 或 Zsh 中,Ctrl+R然后notebook会找到您上次运行包含“笔记本”的内容的时间。在 fish shell 下,只需键入notebook并按向上箭头键即可开始反向搜索。

于 2020-06-29T11:18:49.217 回答
5

现在我打算只使用带有新设置的 django 的分叉版本来跳过 async_unsafe 检查。一旦 ORM 获得异步支持,我可能不得不重写我的项目以支持它并删除标志。

编辑:现在有一个 PR 可以添加一个 env 变量(DJANGO_ALLOW_ASYNC_UNSAFE)来禁用检查(https://github.com/django/django/pull/12172

于 2019-12-02T16:24:07.667 回答
1

我添加了

os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"项目的setting.py中的代码一直到文件,然后

命令python3 manage.py shell_plus --notebook

如果您使用的是 python3 或使用 python

而已。为我工作。

于 2020-05-31T16:47:48.337 回答