【问题标题】:migrating flask web application currently using uWSGI web server to ASGI web server(uvicorn)将当前使用 uWSGI Web 服务器的烧瓶 Web 应用程序迁移到 ASGI Web 服务器(uvicorn)
【发布时间】:2020-02-18 11:22:20
【问题描述】:

我目前有一个使用实现 WSGI 标准的 uWSGI Web 服务器的烧瓶 Web 应用程序,需要将此应用程序迁移到 uvicorn 实现 ASGI 标准的 Web 服务器。

如果我从许多可用选项中选择使用 uvicorn Web 服务器,比如 Hypercorn、Daphne,那么我应该从可用选项中选择哪个 Web 微框架(而不是烧瓶),比如 Starlette、Quart、Django/Channels 来获取这次迁移顺利吗?

层次结构是这样的:

  Uvicorn: an ASGI server 

        Starlette: (uses Uvicorn) a web microframework

             FastAPI: (uses Starlette) an API microframework with several
                      additional features for building APIs, with data validation, etc.

正如我目前所读到的,

Quart 是一个基于 Asyncio 的 Python Web 微框架。它的目的是 提供在 Web 上下文中使用 asyncio 的最简单方法,尤其是 与现有的 Flask 应用程序。

FastAPI 已被证明是 Python 网络框架,拥有最好的框架之一 由第三方基准衡量的性能,这要归功于 基于 Starlette 并由 Starlette 提供支持。 https://fastapi.tiangolo.com/benchmarks/

请建议最好的方法

【问题讨论】:

  • 第一个问题可以是“你为什么需要”迁移?如果是这样,请注意,一旦您迁移到异步框架,您还必须将一些库迁移到异步(例如,特别是块 IO 库,例如数据库库,否则迁移到异步是没有意义的)。这样做你会碰到不太成熟的库并且可能会遇到新的问题。所以真的问自己第一个问题。

标签: flask uwsgi fastapi asgi uvicorn


【解决方案1】:

所以在这里我想补充一下我到目前为止总结的一些东西,

FastAPI 从 Flask(及其几个​​插件)中学到了几个 东西,包括它的简单性。例如,您声明的方式 路线非常相似。这使得从 Flask 迁移到 FastAPI(我看到很多人都在这样做)。

Flask 是一个基于 Python Web 框架的当前/旧标准的框架:WSGI。

FastAPI 基于 Starlette,它使用更新的异步 Web 框架标准:ASGI。

Starlette 作为一个纯粹的“微框架”,更能与 Flask 相媲美。几乎所有你可以用 Flask 做的事情,你都可以用 Starlette(FastAPI 也是如此)。 尽管如此,Starlette 有一些 Flask 中没有的功能(在许多其他 WSGI 框架中,至少默认情况下也是如此),如 WebSockets、后台任务等。

由于 FastAPI 基于 Starlette,它继承了它的所有功能。包括 WebSockets、GraphQL 支持、模板等。因此,至少,使用 FastAPI,您几乎可以完成使用 Flask 可以做的所有事情。

FastAPI 也是一个微型框架(可能是微型框架,因为它包含一些 API 的额外功能)。因此,您可以根据需要构建项目,在许多情况下,您甚至可以使用 Flask 项目中的大部分相同文件(我已经这样做了)。

这已在这篇精彩的帖子中进行了解释:https://www.quora.com/What-are-the-advantages-of-using-FastAPI-over-flask

此外,由 Gunicorn 管理的带有 Uvicorn 的 Docker 映像可用于 Python 3.7 和 3.6 中具有性能自动调整的高性能 FastAPI Web 应用程序,可用于最小化实现。 https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker

【讨论】:

    【解决方案2】:

    我不确定是否有正确答案,因为这主要取决于个人意见。

    我个人认为 Quart 将提供从现有 Flask 应用程序最简单的迁移。这是因为我故意让 Quart API 与 Flask API 相同,从而确保您已经了解的关于 Flask 应用程序的所有内容仍然适用于 Quart 应用程序。我希望这能让你专注于学习 async/await 概念而不是框架。

    我想你会找到你的答案,但通过考虑你需要做的超出框架的事情以及是否存在扩展让你能够做到这一点。与 Flask 生态系统相比,所有 ASGI 框架的生态系统都更小。

    【讨论】:

      【解决方案3】:

      FastAPI 无法与 Flask 相提并论。它类似于 Flask-RESTPlus 之类的东西。

      Starlette 可以与 Flask 进行比较。 Starlette 更符合现代标准,类似于 Quart、Sanic、Bocadillo 等。

      至于最佳方法...将应用程序从一个框架迁移到另一个框架很麻烦。
      无论哪种方式,我都会坚持使用 Gunicorn(使用 Uvicorn 工人类),因为 FastAPI 作者建议这样做。

      【讨论】:

      猜你喜欢
      • 2013-04-26
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多