django 5.0 异步支持覆盖请求-响应关键环节,但非全栈异步:async视图需asgi服务器;orm仅支持a-prefixed异步方法;表单、模板渲染及部分中间件仍为同步,混用会静默退化。

async def 视图函数能直接用,但必须跑在 ASGI 环境下
你写 async def my_view(request) 就算数,Django 会自动识别并调度到事件循环里执行。但前提是:
- 部署时必须用 ASGI 服务器(如
uvicorn或daphne),WSGI 服务器(如gunicorn+syncworkers)会直接报错或静默降级为同步执行 -
DEBUG=True时开发服务器(runserver)默认仍是 WSGI 模式,需显式加--use-asgi参数才能启用异步支持 - 中间件也得是异步的:同步中间件混在异步视图链里会触发
SyncToAsyncMiddleware自动包装,但可能引入隐式阻塞和上下文丢失风险
ORM 异步查询有,但只限于 a-prefixed 方法,且不支持所有操作
Django 5.0 提供了 aget()、afirst()、aexists()、acount()、aiterator() 等异步方法,但:
- 不支持
await MyModel.objects.all().order_by(...).filter(...)这种链式调用后直接 await —— 必须用await MyModel.objects.filter(...).aorder_by(...).afirst()(注意是aorder_by,不是order_by) - 聚合函数如
Sum、Count暂无对应异步版本;Coalesce虽支持数据库端默认值,但本身不是异步 API -
select_related和prefetch_related仍为同步,异步视图中调用会阻塞事件循环,需用async_to_sync包装或拆成多次异步查询 - 事务块
async with transaction.atomic()可用,但嵌套事务或保存点(savepoint)的异步支持尚未完整落地
表单验证仍是同步的,别指望 async clean() 或 async validators
Django 5.0 没有给 forms.Form.clean()、forms.Field.validators 或 ModelForm 加上 async 支持:
- 你在异步视图里调用
form.is_valid(),整个验证过程仍是同步执行,哪怕里面包含耗时的正则匹配或本地逻辑 - 想做异步校验(比如查用户名是否已被注册),得手动把这部分逻辑抽出来,用
await单独调用,再把结果塞进form.add_error()—— 表单本身不帮你 await -
sync_to_async可以包装同步表单逻辑,但这是“模拟异步”,不是原生异步,无法规避 CPU 密集型验证的阻塞问题
模板渲染支持 async mode,但实际价值有限
Django 5.0 允许在模板中使用 {% async_include %} 或开启 async_mode=True 渲染器,但:
- 模板渲染本质是字符串拼接和 Python 表达式求值,属于 CPU-bound,不是 I/O-bound,异步化收益极低
- 目前仅支持少数内置标签(如
include、extends)的异步变体,自定义标签几乎都不支持async def render - 若模板里嵌了
{{ object.some_property }},而该 property 是个异步方法,会直接报TypeError: object is not iterable—— Django 不会自动 await 属性访问
asyncpg)、以及 ASGI server 的 worker 配置,否则写的全是“假异步”。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











