异步支持

New in Django 3.0.

Django 已对异步 ("async") Python 进行了支持,但还没有支持异步视图或中间件;它们可能在未来的版本中支持。

对异步生态系统的其他部分的支持有限;换句话说,Django 原生的使用 ASGI 和一些异步安全的支持。

异步安全

Django 的一些关键部分无法在异步环境里安全运行,因为它们的全局状态不支持协同工作。这些 Django 部分被归类为 "不安全异步",并且受到保护,无法在异步环境中执行。ORM 是主要的例子,但其他部分也以这种方式受到保护。

如果你试着从具有 运行事件循环 的线程中运行这些部分中的任何一个,你将得到 SynchronousOnlyOperation 错误。注意,你不必在异步函数内部即可得到这个错误。如果你直接从一个异步函数中调用了同步函数,而没有经过类似``sync_to_async`` 或线程池之类的操作,那么它也可能会报这个错误,因为你的代码仍然在异步上下文中运行。

如果遇到了这个错误,你应该修改代码以免在异步上下文中调用这个有问题的代码;相反,你可以编写代码在同步函数中与不安全异步交流,使用 asgiref.sync.async_to_sync 或在它自己线程内部运行任何其他首选方式来调用。

如果你 绝对 迫切需要从异步上下文中运行此代码 - 比如,它是由外部环境强加给你,并且你确定它不会同时运行(例如在 Jupyter notebook 里),那你可以使用 DJANGO_ALLOW_ASYNC_UNSAFE 环境变量来禁用告警。

警告

如果启用了这个选项,并且同时访问 Django 的异步不安全 (async-unsafe) 部分,你会遇到数据丢失或损坏,所以一定要非常小心,并且不要再生产环境里这样使用。

如果你需要在 Python 中执行此操作,请使用 os.environ

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