FastAPI-7:框架比较(Flask、Django及FastAPI)
pythontesting 2024-06-14 08:09:01 阅读 83
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(第三方软件包)支持。
参考资料
- 软件测试精品书籍文档下载持续更新 https://github.com/china-testing/python-testing-examples 请点赞,谢谢!
- 本文涉及的python测试开发库 谢谢点赞! https://github.com/china-testing/python_cn_resouce
- python精品书籍下载 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
- Linux精品书籍下载 https://www.cnblogs.com/testing-/p/17438558.html
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的支持使其在许多情况下比竞争对手运行得更快。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。