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

标签 asynchronous jupyter django-3.0

我使用 Django 3.0.6 和 Jupyter notebook 运行 shell_plus --notebook .

我尝试运行查询集:
User.objects.all()
但是返回这个错误SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async .

我试试这个命令

from asgiref.sync import sync_to_async

users = sync_to_async(User.objects.all())

for user in users:
    print(user)

TypeError: 'SyncToAsync' object is not iterable

Django文档的解决方案
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"在 settings.py 中是唯一的解决方案吗?

最佳答案

sync_to_async需要一个可调用的,而不是结果。相反,你想要这个:

from asgiref.sync import sync_to_async

users = sync_to_async(User.objects.all)()

for user in users:
    print(user)

您还可以将要包装的调用放入装饰函数中:

from asgiref.sync import sync_to_async

@sync_to_async
def get_all_users():
    return User.objects.all()

for user in await get_all_users():
    print(user)

请注意,这必须在异步上下文中使用,因此完整示例如下所示:

from asgiref.sync import sync_to_async

@sync_to_async
def get_all_users():
    return User.objects.all()

async def foo(request):
    for user in await get_all_users():
        print(user)

Full documentation

关于asynchronous - Django : SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61926359/

相关文章:

javascript - Google Map API v2 - GeoCoder - 如何自定义标记?

node.js - 如何将 Node.js 中到达速度过快的事件输入一一写入数据库

jupyter-notebook - Jupyter 笔记本中的 IOPub 数据速率超出(查看图像时)

python-3.x - nginx 不提供 Django 管理静态文件

python - Django导入错误: cannot import name 'render_to_response' from 'django.shortcuts'

python - 控制 Django 继承模型中的对象创建流程

java - 静态方法中的 TimerTask 在执行之前会被垃圾回收吗?

javascript - 如何在node.js中逐行运行代码

python - 一旦另一个单元完成,就评估一个单元

jupyter - 在我的本地计算机上使用 Jupyter Notebook 在远程计算机上运行代码