Django 5.0 的 async 视图必须搭配 ASGI 服务器(如 uvicorn)运行,数据库操作需用 sync_to_async 包装或原生异步方法,避免阻塞事件循环;中间件、装饰器也须显式声明为 async 才能协同工作。

async def 视图函数必须搭配 ASGI 服务器运行
Django 5.0 的 async def 视图不会在 WSGI(如 Gunicorn + uWSGI)下真正异步——它会被自动包装成同步调用,失去所有并发优势。你看到的“能跑”,只是 Django 兼容层在兜底,不是真正的异步执行。
必须用 ASGI 服务器,例如:daphne、uvicorn 或 hypercorn。本地开发推荐 uvicorn:
uvicorn myproject.asgi:application --reload
同时确认项目已启用 ASGI:检查是否存在 asgi.py 文件,且 ASGI_APPLICATION 在 settings.py 中指向它,例如:
ASGI_APPLICATION = "myproject.asgi.application"
数据库操作不能直接 await,得用 sync_to_async 包装
Django 默认 ORM 是同步的。async def 视图里直接写 MyModel.objects.all() 会阻塞事件循环,和写同步视图没区别,还可能引发 RuntimeError: This method must be run in async mode。
正确做法是用 sync_to_async 显式包裹耗时同步调用:
from asgiref.sync import sync_to_async
<p>async def my_view(request):</p><h1>❌ 错误:直接调用</h1><pre class="brush:python;toolbar:false;"># items = MyModel.objects.filter(active=True)
# ✅ 正确:包装后 await
items = await sync_to_async(list)(MyModel.objects.filter(active=True))
return JsonResponse({"count": len(items)})
-
sync_to_async默认会在线程池中执行,适合 I/O 密集型操作(如 DB 查询、文件读写) - 避免在
sync_to_async里做 CPU 密集事(比如大列表排序),否则会拖慢整个事件循环 - 如果模型方法本身支持异步(如 Django 4.1+ 的
afirst()、acount()),优先用原生异步方法,不用包装
不要在 async 视图里混用 threading 或 time.sleep
time.sleep(2) 或手动起 threading.Thread 会彻底阻塞当前 asyncio event loop,让其他请求卡住——这比同步视图还糟,因为一个慢请求会拖垮整条协程队列。
替代方案:
- 用
await asyncio.sleep(2)(非阻塞) - 第三方 HTTP 请求用
aiohttp或httpx.AsyncClient,别用requests - 需要 CPU 密集计算?用
loop.run_in_executor扔到进程/线程池,但要评估是否真有必要异步化
中间件和装饰器必须显式声明为 async 才能链式生效
普通函数中间件(def process_request)在 async 视图中会被降级为同步执行,无法 await,也无法拦截或修改 request/response 的异步流程。
要让中间件参与 async 流程,必须定义为 async def,且返回 await call_next(request):
class AsyncAuthMiddleware:
async def __call__(self, request, call_next):
if not request.user.is_authenticated:
return HttpResponseForbidden()
return await call_next(request)
同理,自定义装饰器(比如权限校验)也要用 async def 实现,并确保内部所有调用都可 await。Django 自带的 @login_required 等装饰器目前仍是同步的,不能直接用于 async 视图。
异步支持是逐层渗透的:视图 async → 中间件 async → 模型方法 async → 第三方库 async。漏掉任意一环,就容易在某个调用点意外阻塞。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











