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

时间:2020-02-18 11:22:20

标签: flask uwsgi fastapi asgi uvicorn

我目前有一个使用 uWSGI Web服务器的Flask Web应用程序,该应用程序实现了WSGI标准,并且需要将该应用程序迁移到 uvicorn > 实施ASGI标准的Web服务器。

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

层次结构如下:

  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上下文中使用asyncio的最简单方法,特别是 使用现有的Flask应用。

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

请以最佳方法提出建议

3 个答案:

答案 0 :(得分:4)

所以在这里我想补充一下我到目前为止已经总结的内容,

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

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

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

在纯粹的“微框架”方面,Starlette将与Flask更具可比性。 Flask几乎可以完成所有操作,Starlette(以及FastAPI也可以完成)。 尽管如此,Starlette具有Flask中不可用的某些功能(至少在默认情况下,在许多其他WSGI框架(如Django)中也不可用),如WebSocket,后台任务等。

由于FastAPI基于Starlette,因此它继承了其所有功能。包括WebSocket,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

答案 1 :(得分:2)

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

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

我认为您可以通过考虑框架之外需要做的事情以及是否存在扩展功能来找到答案。与Flask生态系统相比,所有ASGI框架的生态系统都较小。​​

答案 2 :(得分:0)

FastAPI与Flask不具有可比性。它可与Flask-RESTPlus之类的东西相提并论。

Starlette是与Flask的比较。 Starlette与Quart,Sanic,Bocadillo等类似,都采用了最新的现代标准。

关于最佳方法...将应用程序从一个框架迁移到另一个框架简直就是费力。
我会坚持使用Gunicorn(使用Uvicorn worker类),因为FastAPI作者建议这样做。