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

news/2024/10/1 7:29:21

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 FastAPIapp = FastAPI()@app.get("/hi/{who}")
def greet(who: str):return f"Hello? {who}?"

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

  • Flask 路径
from flask import Flask, jsonifyapp = 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 FastAPIapp = FastAPI()@app.get("/hi")
def greet(who):return f"Hello? {who}?"
  • Flask 查询参数
from flask import Flask, request, jsonifyapp = 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 FastAPIapp = FastAPI()@app.get("/hi")
def greet(who):return f"Hello? {who}?"
  • Flask Body
from flask import Flask, request, jsonifyapp = 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, Headerapp = FastAPI()@app.get("/hi")
def greet(who:str = Header()):return f"Hello? {who}?"
  • Flask Header
from flask import Flask, request, jsonifyapp = 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的支持使其在许多情况下比竞争对手运行得更快。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/45034.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

AI “黏土画风”轻松拿捏,手把手带你云端部署 ComfyUI

AI 绘画领域,Stable Diffusion WebUI、Midjourney 、DALL-E 都聚拢了一大批的应用开发者和艺术创作者。ComfyUI 出现时间略晚,但是它让创作者通过工作流的方式,实现自动化水平更高的 AI 生图流程,一面世就以强劲势头脱颖而出,在 WebUI 领域开创了全新的篇章。作者:鸥弋、…

pwn学习-栈迁移

栈迁移:简单理解就是在栈溢出的时候可溢出的字符过少,只能溢出ebp和ret的地址,可以使用leave_ret这个gadget来实现栈的迁移。 在栈中,默认情况下汇编语言在栈结束的时候都默认会执行一次leave和ret指令,我们利用这个特性将返回地址修改为leave_ret的gadget,将会执行两次le…

工业通讯协议(四)- OPCUA

在现代工业自动化领域,OPC UA(开放性生产控制和统一架构)是一种广泛应用的通信协议。参考:https://www.opc-router.com/what-is-opc-ua/#:~:text=In this context%2C the meaning of UA in,COM%2FDCOM to purely binary TCP%2FIP or alternatively SOAP. https://github.co…

视频生成模型 Dream Machine 开放试用;微软将停止 Copilot GPTs丨 RTE 开发者日报 Vol.224

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

活动回顾丨飞天技术沙龙 Serverless + AI 专场(上海站)回顾 PPT 下载

5 月 31 日“飞天技术沙龙 Serverless + AI 专场”上海站圆满落幕。活动受众以关注 Serverless 技术的开发者、企业决策人、云原生领域创业者为主,活动形式为演讲、动手实操,让开发者通过一个下午的时间增进对 Serverless 技术的理解,快速上手 Serverless,拥抱云计算新范式…

虚拟环境配置以及xshll配置

虚拟机和xshll相关演示环境:win11 + VMware16pro+xshell7+centos7.9 虚拟机和xshell配置 1.vmware的安装【16pro】,镜像导入注意【不要将软件下载到带中文和其他特殊字符的目录内】硬件配置【2核2线程2G内存就够。IP地址就动态获取就行】启动centos虚拟机,输入用户名和密码获…

阿里云可观测 2024 年 5 月产品动态

阿里云可观测 2024 年 5 月产品动态

模拟集成电路设计系列博客——6.4.1 电阻电容混合转换器

6.4.1 电阻电容混合转换器 在混合设计中,需要以不同的比例组合前三章中讨论的三种技术。混合设计是设计DA转换器中的一种流行方式,因为它能够组合不同方式的优点。例如,在设计中经常使用温度计码处理高几位MSB,而使用二进制码方式处理低几位LSB。使用这种方式,对于最需要处…