ASGI是Django 5.0高并发部署的必需起点,必须用asgi.py替代wsgi.py启动(如uvicorn myproject.asgi:application),配合异步ORM、Redis缓存及Nginx反向代理,才能释放单进程千级并发能力。

ASGI 是必须启用的起点,Django 5.0 默认支持但不自动启用 —— 如果你还在用 wsgi.py 启动服务,那并发能力就卡死在同步模型里了,再多 worker 也扛不住 I/O 等待。
必须用 asgi.py 替代 wsgi.py 启动服务
WSGI 只能走多进程/多线程模型,每个请求独占一个线程,数据库查询、HTTP 调用、文件读写一卡,整个线程就挂起。而 asgi.py 支持真正的异步调度,单进程就能并发处理成百上千连接。
检查你的项目根目录下是否存在有效的 asgi.py(Django 5.0 创建项目时已自动生成),内容应类似:
import os
from django.core.asgi import get_asgi_application
<p>os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
application = get_asgi_application()启动时必须用 uvicorn,不能用 gunicorn --worker-class sync:
立即学习“Python免费学习笔记(深入)”;
uvicorn myproject.asgi:application --host 0.0.0.0:8000 --workers 4- 若需 WebSocket 或 Channels 支持,确保
ProtocolTypeRouter已配置,且channels在INSTALLED_APPS中 - 别在
asgi.py里 import 同步阻塞模块(如旧版数据库驱动、requests.get)—— 它们会拖垮整个 event loop
async def 视图必须配 await 异步 ORM 和缓存调用
光把视图函数改成 async def 没用,里面如果调用 User.objects.all().count() 这种同步方法,Uvicorn 会退化为线程池执行,失去异步优势。
必须全部切换到异步接口:
- 数据库:用
.acount()、.aonly()、.afirst(),而不是.count()、.only() - 缓存:用
await cache.aget(key)和await cache.aset(key, val),不是cache.get() - 外部 HTTP:用
aiohttp或httpx.AsyncClient,禁用requests - 文件操作:避免
open(),改用anyio.Path或异步库封装
示例有效写法:
提供使用 django-unfold (v0.56+) 构建高级 Django 管理界面的专业指导。当用户提及 django-unfold、unfold admin 等内容时使用此技能。
async def api_user_count(request):
count = await User.objects.acount() # ✅ 异步计数
data = await cache.aget("user_stats") or {}
return JsonResponse({"count": count, "stats": data})PostgreSQL 连接池和 Redis 缓存必须显式配置
Django 5.0 的异步 ORM 不会自动复用连接,每次 await 查询都可能新建连接,没连接池很快打爆 PostgreSQL 的 max_connections。
DATABASES 配置中至少补上这两项:
-
'CONN_MAX_AGE': 600(保持长连接,减少握手开销) -
'OPTIONS': {'MAX_CONNS': 20, 'MIN_CONNS': 5}(需 psycopg3 >= 3.1.12,否则无效)
Redis 缓存不能只靠默认的 LocMemCache,它不跨进程,也不持久:
- 安装
redis和django-redis CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/1"}}- 务必设
KEY_PREFIX防止多环境 key 冲突
Nginx 必须前置,且静态文件绝不经 Django 处理
Uvicorn 是应用服务器,不是 Web 服务器。让它直接暴露给公网或处理 /static/ 请求,等于把高并发压力全压在 Python 进程上。
Nginx 配置关键点:
- 用
proxy_pass http://127.0.0.1:8000转发动态请求 - 用
location /static/ { alias /var/www/myproject/staticfiles/; }直接由 Nginx 返回静态资源 - 加
proxy_buffering off和proxy_http_version 1.1,避免 ASGI 流式响应被截断 - 别漏掉
client_max_body_size 20M,否则大文件上传直接 413
部署前记得运行:python manage.py collectstatic --noinput,否则 Nginx 找不到 /static/ 下的文件。
真实高并发场景下,最易被忽略的是异步上下文的“传染性”:一个 async def 视图里调用了一个看似无害的同步工具函数,就可能让整个请求退回到线程池执行。宁可拆成两个 endpoint,也不要混用同步/异步调用链。

















