首页 论坛 置顶 你了解 FastAPI 和 ASGI 吗?让我们深入探讨!

正在查看 1 个帖子:1-1 (共 1 个帖子)
  • 作者
    帖子
  • #12982

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

正在查看 1 个帖子:1-1 (共 1 个帖子)
  • 哎呀,回复话题必需登录。