一个 Python 的 ASGI Web 服务器。
源码: https://www.github.com/Kludex/uvicorn
Uvicorn 是一个 Python 的 ASGI Web 服务器实现。
最近 Python 缺乏一个用于异步框架的最小化底层服务器/应用接口。 ASGI 规范填补了这一空白,这意味着我们现在可以开始构建一套通用的工具集, 这些工具集可用于所有异步框架。
Uvicorn 支持 HTTP/1.1 和 WebSockets。
使用 pip 安装:
$ pip install uvicorn
这将安装具有最小(纯 Python)依赖的 uvicorn。
$ pip install 'uvicorn[standard]'
这将安装具有(可能的)“基于 Cython”的依赖和其他“可选的额外项”的 uvicorn。
在此上下文中,“基于 Cython”意味着:
- 事件循环
uvloop将被安装并尽可能使用。 - HTTP 协议将尽可能由
httptools处理。
此外,“可选的额外项”意味着:
- 如果可能,WebSocket 协议将由
websockets处理(如果您想使用wsproto,则需要手动安装)。 - 开发模式下的
--reload标志将使用watchfiles。 - Windows 用户将安装
colorama以实现彩色日志。 python-dotenv将被安装,以便您可以使用--env-file选项。PyYAML将被安装,以便您在需要时可以为--log-config提供一个.yaml文件。
在 example.py 中创建一个应用程序:
async def app(scope, receive, send):
assert scope['type'] == 'http'
await send({
'type': 'http.response.start',
'status': 200,
'headers': [
(b'content-type', b'text/plain'),
],
})
await send({
'type': 'http.response.body',
'body': b'Hello, world!',
})
运行服务器:
$ uvicorn example:app
大多数成熟的 Python Web 框架都始于 WSGI 框架。
WSGI 应用程序是一个单一的、同步的可调用对象,它接收请求并返回响应。 这不允许长期连接,例如长轮询 HTTP 或 WebSocket 连接, 而 WSGI 对这些支持不佳。
异步并发模型还允许诸如轻量级后台任务之类的选项, 并且对于在网络 I/O 上长时间阻塞的端点(例如处理慢速 HTTP 请求)可以减少限制。
ASGI 协议的一个优点是它将服务器实现 与应用程序框架解耦。 这使得 Web 服务器和应用程序框架的生态系统能够互操作。
第一个 ASGI 服务器实现,最初是为了支持 Django Channels 而开发的,是 Daphne Web 服务器。
它在生产环境中被广泛使用,并支持 HTTP/1.1、HTTP/2 和 WebSockets。
此处给出的任何示y例应用程序都可以使用 daphne 运行。
$ pip install daphne
$ daphne app:App
Hypercorn 最初是 Quart Web 框架的一部分,后来 被分离为一个独立的 ASGI 服务器。
Hypercorn 支持 HTTP/1.1、HTTP/2 和 WebSockets。
它还支持 出色的 trio 异步框架,作为 asyncio 的替代方案。
$ pip install hypercorn
$ hypercorn app:App
Mangum 是一个用于将 ASGI 应用程序与 AWS Lambda 和 API Gateway 一起使用的适配器。
Granian 是一个 ASGI 兼容的 Rust HTTP 服务器,它支持 HTTP/2、TLS 和 WebSockets。
Uvicorn 是 BSD 许可的代码。
用心设计和制作。
— 🦄 —
