将当前使用 uWSGI Web 服务器的 Flask Web 应用程序迁移到 ASGI Web 服务器(uvicorn)

Khu*_*ani 6 flask uwsgi asgi fastapi uvicorn

我现在有使用烧瓶Web应用程序uWSGI Web服务器,它实现了WSGI标准,需要这个应用程序迁移到uvicorn Web服务器实现了ASGI标准。

如果我从许多可用选项中选择使用 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.
Run Code Online (Sandbox Code Playgroud)

正如我到目前为止所读到的,

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

由于基于 Starlette 并由其提供支持,FastAPI 已被证明是具有最佳性能之一的 Python Web 框架,由第三方基准测试衡量。https://fastapi.tiangolo.com/benchmarks/

请用最好的方法提出建议

pgj*_*nes 6

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

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

我认为,通过考虑您需要做什么超出框架以及是否存在扩展来让您能够做到这一点,您会找到答案。与 Flask 生态系统相比,所有 ASGI 框架的生态系统都较小。


Khu*_*ani 6

所以在这里我想补充一些我迄今为止得出的结论,

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

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

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

Starlette 与 Flask 更具可比性,因为它是一个纯粹的“微框架”。几乎所有你可以用 Flask 做的事情,你都可以用 Starlette 来做(FastAPI 也是如此)。尽管如此,Starlette 有一些 Flask 没有的功能(至少在默认情况下,在许多其他 WSGI 框架中也没有,比如 Django),比如 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