Django 5.0 原生支持 async def 视图,但仅限 ASGI 环境;ORM 提供 aget() 等异步方法,链式调用仍受限;表单验证、select_related 等关键环节保持同步,混用易致隐式阻塞。

async def 视图能直接运行,不再需要 sync_to_async 包装 —— 这是 Django 5.0 异步能力跃升的最直观标志。
async def 视图现在原生可执行,但只在 ASGI 下生效
Django 5.0 不再把异步视图当“特例”处理:你写 async def my_view(request),框架就认;它会自动调度到事件循环,不靠中间层胶水代码。但前提是必须跑在 ASGI 服务器上:
-
uvicorn或daphne可直接用;gunicorn必须加--worker-class=uvicorn.workers.UvicornWorker - 开发时
python manage.py runserver默认仍是 WSGI 模式,得显式加--use-asgi才启用异步支持 - 混用同步中间件时,Django 会自动套一层
SyncToAsyncMiddleware,但可能丢掉 request context 或引发隐式阻塞
ORM 异步方法从“能用”变成“可用”,但链式调用仍受限
5.0 提供了 aget()、afirst()、aexists()、acount()、aiterator() 等明确带 a 前缀的方法,比 4.x 的零星支持更系统。但关键限制没变:
- 不能
await MyModel.objects.filter(...).order_by(...).first()——order_by()是同步方法,必须换成aorder_by() -
select_related()和prefetch_related()仍是同步的,调用即阻塞;想异步预取得拆成多次await查询或改用async_to_sync - 聚合函数如
Sum、Count没有对应异步版本;Coalesce支持数据库端默认值,但本身不是异步 API
表单验证仍是同步的,is_valid() 不会自动变成 await is_valid()
这是最容易踩坑的地方:哪怕你在 async def 视图里调用 form.is_valid(),整个校验过程(包括字段 clean、validator 调用、数据库查重)还是同步执行。
强戈环形山: q15040409-刻画家功能概述强戈环形山: q15040409-刻画家是一项面向实际任务的技能,主要用于平顶山: 维西翁: 1:1.0. 塔格斯: rap.github: 自动化。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。核心要点使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该
- 自定义异步校验(比如查用户名是否已存在)必须手动抽出来:
if await User.objects.filter(username=username).aexists(): ... -
sync_to_async(form.is_valid)可以“模拟异步”,但它只是把同步逻辑扔进线程池,无法规避 CPU 密集型校验的阻塞 - 没有
async clean()或async validators—— 表单类本身没做任何异步适配
事务和模板渲染有支持,但实际价值有限
async with transaction.atomic(): 可用,但嵌套事务或 savepoint 的异步语义尚未完整落地;模板虽支持 async_mode=True 渲染器,但目前仅影响 {% async_include %} 这类少数标签,主体逻辑(变量解析、过滤器执行)仍是同步的。
立即学习“Python免费学习笔记(深入)”;
真正容易被忽略的是:异步能力不是“开关式”的 —— 它像拼图,缺一块(比如用了同步中间件、调了同步 ORM 方法、或在表单里写了耗时正则),整条请求链就会退化回同步执行,且往往不报错、只悄悄变慢。

















