Python 的 5 大异步 Web 框架

异步编程现在是 Python 中的一等公民。 如果您是 Web 开发人员,那么您可以选择许多令人惊叹的框架!

在撰写本文时,异步不再只是 Python 社区的流行语。 随着其发布 异步 在 3.5 版本的库中,Python 承认了 Node.js 对 Web 开发的影响,并在语言中引入了两个新关键字——async 和 await。 这是一个非常重要的事情,因为 Python 语言非常谨慎地扩展核心语法,除非有迫切的需要,这仅表明 Python 开发人员考虑异步功能的根本重要性。

结果,异步编程的闸门打开了:新旧库开始使用协程功能,异步框架大受欢迎,并且今天仍在编写新框架。 与 Node.js 相当或更好的性能并非闻所未闻,除非您的加载模式涉及大量 CPU 繁重的任务,否则您没有理由不能每秒发出几千个请求。

但足够的动力!

让我们调查一下当前的 Python 环境并查看一些顶级异步框架。

龙卷风

出奇, 龙卷风 根本不是一个新框架。 它的初始版本是在 2009 年(截至撰写本文时正好十年前),从那时起,它的重点一直是提供具有高并发性的坚如磐石的异步编程。

Tornado 从根本上说不是一个 Web 框架。 它是异步模块的集合,也用于构建 Web 框架模块。 更具体地说,这些模块是:

  • 协程和其他原语(tornado.gen、tornado.locks、tornado.queues 等)
  • 网络模块(tornado.ioloop、tornado.iostream 等)
  • 异步服务器和客户端(tornado.httpserver、tornado.httpclient 等)

这些已被组合以产生最终的框架模块:tornado.web、tornado.routing、tornado.template 等。

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

Tornado 在 Python 社区拥有强大而坚定的追随者,经验丰富的架构师使用它来构建功能强大的系统。 它是一个长期以来一直解决并发问题的框架,但可能没有成为主流,因为它不支持 WSGI 标准并且被太多人接受(请记住,大部分 Python 库仍然是同步的)。

  通知是材料设计遇到锁屏通知的地方

桑尼奇

桑尼奇 是一个真正意义上的“现代”框架:它不支持低于 3.6 的 Python 版本,支持开箱即用的简单通用的 async/await 语法,因此不会让你阅读负载在编写第一个 HTTP 处理程序之前,请记住文档并记住边缘情况。

结果,生成的语法非常令人愉快(至少在我看来); 它类似于您使用任何其他微框架(例如 Flask、CherryPy)编写的代码,只添加了一些异步:

from sanic import Sanic
from sanic.response import json

app = Sanic()

@app.route("/")
async def test(request):
    return json({"hello": "world"})

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000)

Sanic 可以说是 Python 世界中最受欢迎和最受欢迎的异步框架。 它具有您项目所需的几乎所有功能——路由、中间件、cookie、版本控制、蓝图、基于类的视图、静态文件、流、套接字等——以及它不提供开箱即用的功能— 模板、数据库支持、文件 I/O、队列 — 可以添加,因为到目前为止,这些异步库已经足够了。

维宝拉

维宝拉 是 Sanic 的近亲,只是它致力于成为目前最快的 Python Web 服务器。 事实上,第一次访问它的网站时,你会看到一个框架比较:

如您所见,Vibora 声称比经典框架快几倍,比其最接近的竞争对手 Sanic 快两倍以上。 当然,基准测试要持保留态度。 🙂

尽管在语法和功能上,Vibora 可以与 Sanic 相媲美(或者甚至可能稍微好一点,因为它捆绑了流行的库,并且模板之类的东西是开箱即用的),但我认为 Sanic 更成熟,因为它存在的时间更长并且有一个更大的社区。

from vibora import Vibora, JsonResponse

app = Vibora()

@app.route('/')
async def home():
    return JsonResponse({'hello': 'world'})

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=8000)

但是,如果您是表演迷,Vibora 可能会让您的船浮起来。 也就是说,在撰写本文时,Vibora 正在进行完全重写以变得更快,并且 关联 对其性能版本表示它正在“大力发展”。 对于那些较早使用 Vibora 并且很快必须面临重大变化的人来说,这将是一个失望,但是,嘿,这是 Python 异步世界的早期阶段,没有人期望事情会稳定。

夸脱

如果你喜欢在 Flask 中开发,但对缺乏异步支持感到遗憾,你会喜欢的 夸脱 很多。

  HDMI 与 DisplayPort – 哪个更好?

夸脱符合 地理信息系统 标准,它是著名的 WSGI 标准的继承者,并提供异步支持。 Quart 的有趣之处在于它不仅与 Flask 相似,而且实际上与 Flask API 兼容! 这个框架的作者想要保留 Flask 的感觉,只是添加了异步、WebSockets 和 HTTP 2 支持。 因此,您可以直接从 Flask 文档中学习 Quart,只需记住 Quart 中的函数是异步的。

from quart import Quart

app = Quart(__name__)

@app.route('/')
async def hello():
    return 'hello'

app.run()

感觉(几乎)和 Flask 完全一样,不是吗?!

由于 Quart 是 Fl​​ask 的演变,因此 Flask 内部的所有功能都可用:路由、中间件、会话、模板、蓝图等。 事实上,你甚至可以直接在 Quart 中使用 Flask 扩展。 一个问题是仅支持 Python 3.7+,但是,如果您没有运行最新版本的 Python,那么异步可能不是正确的路径。 🙂

如果您没有早期使用 Flask 的经验,那么文档真的很需要,但我可以推荐 Quart,因为它可能是唯一一个即将发布 1.0 的异步框架。

快速API

此列表中的最后一个(但最令人印象深刻的)框架是 快速API. 不,它不是一个仅 API 的框架; 事实上,FastAPI 似乎是我在研究异步 Python 框架时遇到的功能最丰富、文档最丰富的框架。

有趣的是,框架作者深入研究了其他几个框架,从像 Django 这样的当代框架到像 Sanic 这样的现代框架,以及跨技术研究 NestJS(一个 Node.js,Typescript Web 框架)。 可以阅读他们的开发理念和广泛的比较 这里.

语法非常令人愉快; 甚至可以说它比我们遇到的其他框架更有趣:

rom fastapi import FastAPI

app = FastAPI()

@app.get("/users/me")
async def read_user_me():
    return {"user_id": "the current user"}

@app.get("/users/{user_id}")
async def read_user(user_id: str):
    return {"user_id": user_id}

现在,让 FastAPI 胜过其他框架的杀手级特性列表如下:

  修复 Xbox 错误代码 0x8b0500b6

自动生成 API 文档:一旦编写了端点,您就可以使用符合标准的 UI 来使用 API。 支持 SwaggerUI、ReDoc 等。

该框架还使用 JSON Schema 自动生成数据模型文档。

现代开发:是的,“现代”这个词经常被抛出,但我发现 FastAPI 实际上是言出必行。 依赖注入和类型提示是一等公民,不仅执行良好的编码原则,而且从长远来看防止错误和混乱。

广泛的文档:我不了解你,但我完全是一个好的文档的傻瓜。 在这方面,FastAPI 毫无疑问地胜出。 它有一页又一页的文档解释了几乎每一个小细节和“小心!” 各级开发人员的时刻。 我在这里的文档中感觉到了一个清晰的“心脏和灵魂”,我能找到的唯一比较是 Django 文档(是的,FastAPI 文档就是那么好!)。

超越基础:FastAPI 支持 WebSockets、Streaming 和 GraphQL,此外还有 CORS、会话、cookie 等所有传统助手。

那么性能呢? 好吧,FastAPI 是建立在令人惊叹的 Starlette 库之上的,其性能与 Node 相匹配,在某些情况下甚至是 Go! 总而言之,我真的感觉 FastAPI 将成为 Python 的顶级异步框架。

结论

这些天来,Python 异步领域发生了很多事情。 新框架不断涌现,旧框架正在被重写,库正在进化以匹配异步行为。 虽然 Python 具有对事件循环的内置支持,并且可以使应用程序的某些部分异步,但您可以选择全力以赴并在此处构建其中一个框架。 请务必牢记长远:一些 Python 异步框架处于早期阶段,并且正在迅速发展,这将损害您的开发过程并提高业务成本。 谨慎是关键!

但一切都说了又做了; 当涉及到 Web 框架时,Python 已准备好为生产环境提供出色的性能。 如果长期以来您一直在考虑迁移到 Node,那么现在您不需要这样做了! 🙂

听起来很酷? 今天掌握 Python