在 Uvicorn 和 Starlette 之前:同步服务器是如何工作的?
在传统的 web 开发中,像 WSGI(Web 服务器网关接口) 的服务器被用来连接 web 应用程序和 HTTP 服务器。像 Flask 和 Django 这样的框架依赖 WSGI 服务器(例如 Gunicorn)来处理传入的请求。然而,WSGI 服务器在设计上是同步的,这意味着:
- 阻塞 I/O:每个请求会阻塞一个工作线程,直到完成,这使得它在处理高并发场景(如 WebSockets 或长时间请求)时效率低下。
- 可扩展性挑战:扩展需要增加更多的线程或进程,这增加了资源消耗。
为了解决这些限制,ASGI(异步服务器网关接口) 标准应运而生。ASGI 使得异步、非阻塞的通信成为可能,非常适合现代应用程序,尤其是需要 WebSockets、HTTP/2 或其他实时功能的场景。
Uvicorn 和 Starlette 的到来
FastAPI 构建于 Uvicorn 和 Starlette 之上,它们各自承担着不同但互补的角色。让我们深入了解它们的目的和优点。
1. Uvicorn: ASGI 服务器
Uvicorn 是一个 ASGI 服务器,用于运行 FastAPI 应用程序。它负责:
- 处理 HTTP 请求:Uvicorn 接收传入的 HTTP/HTTPS 请求并将其路由到应用程序。
- 异步 I/O:旨在高效处理异步调用,使其比同步服务器更快且更具可扩展性。
- 支持的协议:
- HTTP/1.1, HTTP/2
- WebSockets
- 生产就绪:Uvicorn 的速度和轻量级设计使其适合生产环境。
Uvicorn 的优点
- 使用 uvloop(为 Python 优化的事件循环)实现高性能的事件驱动架构。
- 对 WebSockets 和 HTTP/2 的原生支持。
- 对异步应用程序的最小开销。
如何使用 Uvicorn
以下是使用 Uvicorn 运行 FastAPI 应用的示例:
uvicorn main:app --host 0.0.0.0 --port 8000
你也可以通过编程方式运行它:
import uvicorn
if __name__ == "__main__":
uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)
2. Starlette:ASGI框架
Starlette 是一个轻量级的 ASGI 框架,为 FastAPI 提供核心功能。它提供了构建 web 应用程序的工具和实用程序,包括:
- 路由:将 URL 映射到 Python 函数或类。
- 中间件:添加层以处理请求/响应(例如,认证、日志记录)。
- 后台任务:在请求/响应周期之外执行任务。
- WebSockets:实现与客户端的实时通信。
- 测试工具:通过集成测试客户端简化测试过程。
Starlette 的优点
- 模块化和灵活的设计,使其成为像 FastAPI 这样的框架的良好基础。
- 内置支持异步编程,允许高效利用资源。
- 全面的文档和活跃的社区支持。
如何使用 Starlette
虽然在 FastAPI 中你很少直接与 Starlette 交互,但你可以独立使用它来构建最小的 web 应用程序。以下是一个示例:
from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route
async def homepage(request):
return JSONResponse({"message": "Hello from Starlette!"})
app = Starlette(debug=True, routes=[
Route('/', homepage)
])
这段代码展示了如何使用 Starlette 框架创建一个简单的 web 应用。首先,从 `starlette.applications` 导入 `Starlette`,从 `starlette.responses` 导入 `JSONResponse`,以及从 `starlette.routing` 导入 `Route`。接着定义了一个异步函数 `homepage`,该函数接收一个请求并返回一个 JSON 响应,内容为 “Hello from Starlette!”。最后,创建了一个 `Starlette` 应用实例,启用了调试模式,并设置了路由,将根路径 `/` 映射到 `homepage` 函数。
使用 Uvicorn 运行此应用程序:
uvicorn app:app --reload
Uvicorn与Starlette之间的区别
特性 | Uvicorn | Starlette |
---|---|---|
类别 | ASGI服务器 | ASGI框架 |
目的 | 运行应用程序 | 提供核心Web框架功能 |
重点 | 处理请求/响应生命周期 | 路由、中间件、WebSockets等 |
交互 | 运行FastAPI应用 | 构成FastAPI的基础 |
整合:理解FastAPI中的Uvicorn和Starlette
FastAPI结合了Uvicorn和Starlette的最佳特性:
-
- Uvicorn:通过处理应用程序的执行来确保高性能。
-
- Starlette:为FastAPI的核心功能提供支持,例如路由、中间件和WebSocket支持。
作为开发者,理解Uvicorn和Starlette的角色可以帮助你:
- 优化您的应用程序以提高性能(例如,为生产环境调整 Uvicorn 设置)。
- 在构建自定义功能时利用 Starlette 的工具。
通过理解它们各自独特但又相互关联的角色,您可以在构建或部署 FastAPI 应用程序时做出更明智的决策。