FastAPI-7:框架比较(Flask、Django及FastAPI)

7 框架比较(Flask、Django及FastAPI)

关于一个新的 Web 框架,您可能想知道的第一件事就是如何入门,而一种自上而下的方法就是定义路由(从URL和HTTP方法到函数的映射)。

7.1 Flask

Flask自称是微框架。它提供基本功能,你可以根据需要下载第三方软件包进行补充。它比 Django小,入门时学习起来更快。

Flask是同步的,基于WSGI而不是ASGI。quart的新项目正在复制Flask并添加 ASGI 支持。

让我们从头开始,看看 Flask 和 FastAPI 是如何定义网络路由的。

7.1.1 路径

在顶层,Flask和FastAPI都使用装饰器将路由与网络端点关联起来。在例 7-1 中,我们复制了例 3-11(来自第 3 章),它从 URL 路径中获取要问候的人。

  • FastAPI 路径
from fastapi import FastAPI

app = FastAPI()

@app.get("/hi/{who}")
def greet(who: str):
    return f"Hello? {who}?"

默认情况下,FastAPI 会将 f "Hello? {who}?"字符串转换成 JSON 格式并返回给网络客户端。

  • Flask 路径
from flask import Flask, jsonify

app = Flask(__name__)

@app.route("/hi/<who>", methods=["GET"])
def greet(who: str):
    return jsonify(f"Hello? {who}?")

请注意,装饰器中的 who 现在由 < 和 > 限定。在 Flask 中,除非是默认的 GET,否则方法需要作为参数包含在内。因此,这里可以省略 methods=[“GET”],但明确一点总没有坏处。

Flask 2.0 支持FastAPI风格的装饰器,如 @app.get 而不是 app.route。

Flask jsonify() 函数会将其参数转换为 JSON 字符串并返回,同时返回 HTTP 响应头,表明这是一个 JSON 字符串。如果返回的是 dict(而不是其他数据类型),最新版本的 Flask 会自动将其转换为 JSON 并返回。显式调用 jsonify() 适用于所有数据类型,包括 dict。

7.1.2 查询参数

在示例 7-3 中,让我们重复示例 3-15,在该示例中,who 作为查询参数传递(在 URL 中的 ? 后面)。

  • FastAPI 查询参数
from fastapi import FastAPI

app = FastAPI()

@app.get("/hi")
def greet(who):
    return f"Hello? {who}?"
  • Flask 查询参数
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route("/hi", methods=["GET"])
def greet():
    who: str = request.args.get("who")
    return jsonify(f"Hello? {who}?")

在 Flask 中,我们需要从请求对象中获取请求值。在本例中,args 是一个包含查询参数的 dict。

7.1.3 Body

  • FastAPI Body
from fastapi import FastAPI

app = FastAPI()

@app.get("/hi")
def greet(who):
    return f"Hello? {who}?"
  • Flask Body
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route("/hi", methods=["GET"])
def greet():
    who: str = request.json["who"]
    return jsonify(f"Hello? {who}?")

7.1.4 Header

  • FastAPI Header
from fastapi import FastAPI, Header

app = FastAPI()

@app.get("/hi")
def greet(who:str = Header()):
    return f"Hello? {who}?"
  • Flask Header
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route("/hi", methods=["GET"])
def greet():
    who: str = request.headers.get("who")
    return jsonify(f"Hello? {who}?")

与查询参数一样,Flask 将请求数据保存在请求对象中。这次是头信息的 dict 属性。头关键字不区分大小写。

7.2 Django

Django 比 Flask 或 FastAPI 更大、更复杂,据其网站介绍,它的目标用户是 “有期限的完美主义者”。其内置的对象关系映射器(ORM)对使用大型数据库后端的网站非常有用。与其说它是一个工具包,不如说它是一个整体。额外的复杂性和学习曲线是否合理取决于您的应用。

虽然Django是一个传统的WSGI应用程序,但3.0版本增加了对 ASGI 的支持。

与Flask 和 FastAPI 不同的是,Django 喜欢在单个 URLConf 表中定义路由(将 URL 与 Web 函数关联,它称之为视图函数),而不是使用装饰器。这使得在一个地方查看所有路由更容易,但当您只查看函数时,就很难看出哪个 URL 与函数相关联。

7.3 其他Web框架功能

  • 表单

所有三个软件包都支持标准 HTML 表单。

  • 文件

所有这些软件包都能处理文件上传和下载,包括多部分 HTTP 请求和响应。

  • 模板

模板语言可让您混合使用文本和代码,对于面向内容的网站(带有动态插入数据的 HTML 文本)而非 API 网站非常有用。最著名的 Python 模板包是 Jinja,Flask、Django 和 FastAPI 都支持它。Django 也有自己的模板语言。

如果你想使用基本 HTTP 以外的网络方法,可以试试这些:

  • 服务器发送事件

根据需要向客户端推送数据。FastAPI (sse-starlette)、Flask (Flask-SSE) 和 Django (Django EventStream) 支持。

  • 队列

ZeroMQ、Celery、Redis 和 RabbitMQ 等外部软件包支持作业队列、发布-订阅和其他网络模式。

  • WebSockets

由 FastAPI(直接)、Django(Django Channels)和 Flask(第三方软件包)支持。

参考资料

7.4 数据库

Flask 和 FastAPI 的基础软件包中不包含任何数据库处理功能,但数据库处理是 Django 的一项关键功能。

您网站的数据层可以在不同级别访问数据库:

  • 直接 SQL(PostgreSQL、SQLite)

  • 直接 NoSQL(Redis、MongoDB、Elasticsearch)

  • 生成 SQL 的 ORM

  • 生成 NoSQL 的对象文档/数据映射器/管理器(ODM)

对于关系数据库,SQLAlchemy 是一个出色的软件包,它包含从直接 SQL 到 ORM 的多个访问级别。这是 Flask 和 FastAPI 开发人员的共同选择。FastAPI 的作者在 SQLModel 软件包中同时使用了 SQLAlchemy 和 Pydantic。对于有大量数据库需求的网站来说,Django 通常是首选框架。它有自己的 ORM 和自动数据库管理页面。虽然有些资料建议让非技术人员使用该管理页面进行日常数据管理,但一定要小心。有一次,我看到一个非专业人员误解了管理页面的警告信息,导致需要从备份中手动恢复数据库。

7.5 框架选择

对于基于 API 的服务,FastAPI 似乎是目前的最佳选择。在快速启动和运行服务方面,Flask 和 FastAPI 大致相当。Django 需要更多的时间来理解,但它提供了许多对大型网站有用的功能,尤其是那些严重依赖数据库的网站。

7.6 其他Python Web框架

目前的三大 Python 网络框架是 Flask、Django 和 FastAPI。在 Google 上搜索 Python Web 框架,你会得到大量建议,在此不再赘述。在这些列表中,有一些可能并不突出,但由于某种原因而令人感兴趣,其中包括以下几个:

  • Bottle:一个快速小巧,轻量级的 WSGI 微型web框架,适合快速验证概念。

  • Litestar:与 FastAPI 类似,基于 ASGI/Starlette 和 Pydantic,但有自己的观点。

  • aiohttp 异步http client/server框架(asyncio)

  • Socketify.py声称具有极高性能

7.6 小结

Flask和Django是流行的 Python 网络框架,不过FastAPI的流行速度更快。这三种框架都能处理基本的网络服务器任务,但学习曲线各不相同。FastAPI有更简洁的语法来指定路由,而且它对ASGI的支持使其在许多情况下比竞争对手运行得更快。

posted @ 2024-06-13 18:57  磁石空杯  阅读(313)  评论(0编辑  收藏  举报