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

migrating flask web application currently using uWSGI web server to ASGI web server(uvicorn)

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

如果我从许多可用选项中选择使用 uvicorn web 服务器,比如 Hypercorn、Daphne,那么我应该从可用选项中选择哪个 web 微框架(而不是 flask),比如 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 is a Python web microframework based on Asyncio. It is intended to provide the easiest way to use asyncio in a web context, especially with existing Flask apps.

FastAPI has shown to be a Python web framework with one of the best performances, as measured by third-party benchmarks, thanks to being based on and powered by Starlette. https://fastapi.tiangolo.com/benchmarks/

请推荐最好的方法

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

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

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

所以在这里我想补充一些我目前已经得出的结论,

FastAPI learned from Flask (and several of its plug-ins) several things, including its simplicity. For example, the way you declare routes is very similar. That makes it easy to migrate from Flask to FastAPI (which I see a lot of people doing).

Flask 是一个基于 current/old 标准的框架,用于 Python 网络框架:WSGI。

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

Starlette 更像是 Flask,因为它是一个纯粹的“微框架”。几乎所有你能用 Flask 做的事情,你都可以用 Starlette 做(用 FastAPI 也是如此)。 然而,Starlette 有一些 Flask 不具备的功能(在许多其他 WSGI 框架中也不具备,例如 Django,至少在默认情况下是这样),例如 WebSockets、后台任务和其他功能。

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

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

这已经在这个惊人的 post 中得到了解释:https://www.quora.com/What-are-the-advantages-of-using-FastAPI-over-flask

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

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

Starlette 与 Flask 相提并论。 Starlette 更符合现代标准,类似于 Quart、Sanic、Bocadillo 等。

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