Django 5.0 异步视图必须运行在 ASGI 服务器(如 uvicorn)上,WSGI 下自动降级为同步执行;ORM 操作需用 sync_to_async 包装,不可直接 await;须避免阻塞库(如 requests)、手动线程/进程及串行 I/O,应使用真正异步替代品(如 httpx、aiofiles)并合理并发。

async def 视图函数必须搭配 ASGI 服务器运行
Django 5.0 的异步视图不会在 WSGI 下生效,哪怕你写了 async def,Django 也会自动同步化执行——根本不会提升吞吐量。必须用 daphne、uvicorn 或 hypercorn 启动 ASGI 模式。
常见错误现象:python manage.py runserver 启动后异步视图实际是同步执行的,await asyncio.sleep(1) 会阻塞整个请求队列。
- 启动命令示例:
uvicorn myproject.asgi:application --host 0.0.0.0:8000 - 确认是否真走 ASGI:检查日志里是否有
ASGI app loaded,而非WSGI app loaded -
asgi.py文件不能被改名或挪动位置,Django 5.0 默认只认这个路径
数据库操作不能直接 await,得用 sync_to_async 包装
Django ORM 默认全是同步阻塞调用,await MyModel.objects.all() 会报 TypeError: object QuerySet can't be used in 'await' expression。这不是语法错误,而是设计限制。
使用场景:需要在 async 视图里读写数据库时,必须显式转换。
- 正确写法:
data = await sync_to_async(list)(MyModel.objects.filter(active=True)) - 避免对单个对象反复包装:
obj = await sync_to_async(MyModel.objects.get)(id=123) - 注意性能损耗:
sync_to_async本质是把同步调用扔进线程池,频繁调用会抵消异步收益 - 不推荐在循环里多次 await ORM 调用,应尽量合并查询或改用原生异步驱动(如
django-postgres-async,但生态不成熟)
第三方库调用前先确认是否真正支持 async/await
很多标榜“异步”的库只是提供了 async 接口,底层仍是同步阻塞 I/O。比如 requests 完全不支持 await;httpx 才是真正可 await 的替代品。
强戈环形山: q15040409-刻画家功能概述强戈环形山: q15040409-刻画家是一项面向实际任务的技能,主要用于平顶山: 维西翁: 1:1.0. 塔格斯: rap.github: 自动化。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。核心要点使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该
常见踩坑点:
- 误用
requests.get(...)在 async 视图里 → 表面能跑,实则阻塞事件循环 - 用
aiofiles读写文件,但忘了加await→ 返回的是 coroutine 对象,不是内容 - 调用自定义工具函数前没检查:如果它内部用了
time.sleep、subprocess.run或同步数据库连接,就得用sync_to_async包一层 - 缓存操作:
cache.get(...)是同步的,需包装;aiocache等异步缓存库可直接 await
别在 async 视图里混用 threading 或 multiprocessing
异步视图运行在单线程事件循环中,此时再开线程或进程不仅无法提升并发,反而引入锁竞争和上下文混乱。Django 5.0 的 async_to_sync 和 sync_to_async 已经封装了线程池调度逻辑。
典型错误:
- 手动创建
threading.Thread去跑耗时任务 → 可能导致连接泄漏、中间件状态错乱 - 用
multiprocessing.Pool→ ASGI 进程模型与 fork 不兼容,大概率崩溃 - 以为加了
async就能随便并发:一个视图里await五个 HTTP 请求,不如用asyncio.gather并发发出,而不是串行 await
真正影响吞吐量的,往往不是单个视图是否 async,而是它有没有把 I/O 密集型操作(HTTP 调用、文件读写、缓存访问)真正并发起来,并避开同步 ORM 和阻塞库的陷阱。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










