7

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

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

层次结构如下:

  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 应用程序。

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

请建议最好的方法

4

3 回答 3

8

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

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

于 2020-02-19T06:05:34.610 回答
4

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

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

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

于 2020-02-18T18:54:03.947 回答
2

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

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

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

于 2020-02-26T08:41:12.397 回答