你了解 FastAPI 和 ASGI 吗?让我们深入探讨!

在 Uvicorn 和 Starlette 之前:同步服务器是如何工作的?

在传统的 web 开发中,像 WSGI(Web 服务器网关接口) 的服务器被用来连接 web 应用程序和 HTTP 服务器。像 Flask 和 Django 这样的框架依赖 WSGI 服务器(例如 Gunicorn)来处理传入的请求。然而,WSGI 服务器在设计上是同步的,这意味着:

  1. 阻塞 I/O:每个请求会阻塞一个工作线程,直到完成,这使得它在处理高并发场景(如 WebSockets 或长时间请求)时效率低下。
  2. 可扩展性挑战:扩展需要增加更多的线程或进程,这增加了资源消耗。

为了解决这些限制,ASGI(异步服务器网关接口) 标准应运而生。ASGI 使得异步、非阻塞的通信成为可能,非常适合现代应用程序,尤其是需要 WebSockets、HTTP/2 或其他实时功能的场景。


Uvicorn 和 Starlette 的到来

FastAPI 构建于 UvicornStarlette 之上,它们各自承担着不同但互补的角色。让我们深入了解它们的目的和优点。

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 应用程序时做出更明智的决策。

更多