Uvicorn是ASGI 3规范的高性能服务器实现,要求应用为async def app(scope, receive, send)形式,原生支持WebSocket、HTTP/2、长连接与Lifespan事件,不处理路由/CORS等业务逻辑。

Uvicorn 完全支持 ASGI 3.0 规范,但不支持“ASGI 3.0 特性”这个说法——因为 ASGI 没有 3.0 版本号。 它只存在 ASGI 2 和 ASGI 3 两种接口形态,而 ASGI 3 是当前唯一被广泛采用的标准。所谓“ASGI 3.0”是常见误解,实际指的就是 ASGI 3 接口协议。
ASGI 3 接口长什么样?
Uvicorn 要求你的应用暴露一个可调用对象(函数或类实例),签名必须是:
async def app(scope: dict, receive: callable, send: callable) -> None:
其中:
-
scope是只读字典,含type(如"http"、"websocket")、path、headers等连接元信息 -
receive是异步可等待的接收函数,每次调用返回一个事件字典(如{"type": "http.request", "body": b"..."}) -
send是异步可等待的发送函数,用于推送响应头、响应体、WebSocket 帧等
注意:ASGI 3 不再接受类实例的 __init__ + __call__ 分离写法(那是 ASGI 2 的遗留模式),而是直接要求可调用对象本身是协程函数,或实现了 __call__ 且返回协程的对象。
Uvicorn 0.52.1 是 Python ASGI Web 服务器,提供异步应用服务及 WebSocket 支持,常用于 FastAPI、Starlette 等应用的开发和部署。本下载为官方 PyPI 通用 wheel 包,可使用 pip 安装,并由包管理器处理所需依赖。
Uvicorn 如何处理 ASGI 2 应用?
如果你的应用仍用 ASGI 2 风格(例如 Starlette ≤ 0.29 或某些老中间件),Uvicorn 会自动套一层 ASGI2Middleware 包装:
- 该中间件位于
uvicorn/middleware/asgi2.py - 它把
app(scope)(返回 callable)转成app(scope, receive, send)(直接 await) - 这个转换是透明的,但会带来微小开销;生产环境建议直接升级到 ASGI 3 接口
- 错误日志里如果看到
ASGI2Middleware被调用,说明你正在走兼容路径
哪些“特性”其实是 ASGI 3 协议原生支持的?
Uvicorn 作为 ASGI 3 参考服务器,所有以下能力都来自协议本身,而非 Uvicorn 自行扩展:
-
WebSocket支持:靠scope["type"] == "websocket"+receive/send处理握手与帧 -
HTTP/2支持:需配合 TLS 启动,Uvicorn 用h11或httptools解析,但协议协商由客户端和服务端共同完成 - 长连接与流式响应:只要你在循环中多次
await send(...),Uvicorn 就不会提前关闭连接 - 后台任务(Lifespan):通过
scope["type"] == "lifespan"事件支持启动/关闭钩子,FastAPI 的@app.on_event("startup")就依赖这个
真正容易被忽略的是:Uvicorn 本身不解析路由、不处理 CORS、不校验请求体——这些都得由上层框架(如 FastAPI)或中间件完成。它只保证把原始字节流按 ASGI 3 协议语义,准确地喂给你的 app 函数,并把返回的事件流发回网络。

















