Django,Flask ,FastAPI 怎么选?

2023-11-02

阅读大约需要 4.5 分钟

首先我们达成一个共识,框架是用来帮助我们提升效率,节省时间,避免处理那些低级细节的,如果能达到这个目标,就是一个合适的框架。选择合适的框架,会事半功倍。

Python 领域,开发 Web 应用程序的三个主流框架是 Django,Flask 和 FastAPI。它们都非常优秀,但有各自的特点。本文接下来阐述每个框架的优缺点,以帮助你在使用时做出最合适的选择。

Django

Django 是用于构建网站的免费开源 Web 开发框架。它于 2003 年创建,并使用 MTV 模式,也就是 Model-Template-View 模式,如果不使用 Django 的模版语法,也可以认为是 MVC 模式,即 Model-View-Controler,对应三个文件:models.py, views.py, urls.py。

它以其健壮和简单的特性而广受欢迎,地位相当于 Java 领域的 Spring,并被 Instagram,Youtube 等技术巨头使用,找工作面试,Django 也是重头戏。Django 非常流行,极客时间已经有专门的付费教程。其次它的设计哲学与 Python 非常搭配,鼓励代码复用。

优点

Django 框架的代码结构统一且清晰易懂,开发人员可以像做填空题一样添加更多功能,也可以设计自定义的类或接口,即简单也不失灵活性、扩展性。

Django 生态还有一个利器就是 Django Rest Framework(DRF),DRF 可以让你轻松搭建具有 REST 风格的 API,由于它具有模块化和可自定义的架构,在前后端分离的趋势下,使用 Django 构建 Web API 也非常容易。

自带安全性的中间件。Django 通过提供针对联合 SQL 注入和跨站点请求伪造攻击的防御来提供安全性的访问。

Django 生态非常丰富,第三方类适配的类库也非常多,这意味着遇到问题时你并不孤单。

缺点

Django 可能会因为许多可重用的模块而限制了开发速度。它还需要确保以前的版本仍与新版本兼容,从而导致其运行稍慢。

Django Models 没有 mixins,只有简单的继承。

Django 使用的 ORM 是在 SQLAlchemy 之前创建的,因此 Django ORM 的灵活性较差,因此它不如 SQLAlchemy。

Django 的用例

Django 可以处理任何规模和容量的项目。我们可以将其用于简单站点或高性能站点。一些用例如下:

  • 高负荷预订引擎。

  • 购物平台。

  • 学校管理系统。

  • 内置用于内部数据的自定义 CRM 系统。

  • 支持基于 Web 的应用程序的 IOS 和 Android 应用程序。

  • 管理仪表板,基于照片的验证,用于发送用户通知的电子邮件系统等。

简而言之,如果你要做一个上规模,不断扩展的,大规模,商业化的 Web 项目,Django 是你最好的选择。

Flask

Flask 是一个用 Python 编写的微型 Web 框架,可用于开发简约的 Web 应用程序。Flask 带有诸如模板引擎,缓存和身份验证之类的选项。

它的创建是为了使用 Python 编程语言构建 Web 应用程序。它被设计为易用,快速并且可以扩展成为复杂的应用程序或微服务。

Flask 更像是创作者 Armin Ronacher 在 4 月 1 日对愚人节的恶作剧,在其中依赖了Werkzeug 和 Jinja。令人惊讶的是,它受到了社区的赞赏,这使他们在此方面做得更多。

优点

与其他 Web 应用程序框架不同,flask 让你可以完全控制 Web 开发,从而完全控制应用程序和 Web 开发。开发人员有机会“坐在驾驶员席上”,掌管你想做的事情,例如添加外部功能。

Flask 允许进行单元测试,并且由于其内置的开发服务器,集成的支持等,因此可以通过对一些扩展进行调整来过渡到 Web 框架。

Flask 简单易用,非常适合初学者使用,为开发人员提供了更好地学习和理解它的空间。它还使开发人员可以毫不费力地快速创建应用程序。

缺点

Flask 的很多模块由第三方开发,容易引起安全漏洞。

Flask 具有一个单一的来源,表示它将依次处理每个请求,因此,无论有多少个请求,它仍然会轮流处理它们,这会耗费更多时间。

如果开发人员水平不高,更容易使用低质量的代码创建一个不良的 Web 应用程序。

用例

我们可以将 Flask 用于商业项目。它可以帮助你快速入门,但是网站高负荷情况下效果不佳。

你可以快速实施 Flask 项目,例如:

  • 电子商务系统。

  • Facebook / Twitter机器人。

  • 在线社交网络。

  • 静态网站。

如果你要做一些小型个人项目,比如聊天机器人,或者想实现产品的快速原型,或者喜欢自由的编写代码控制程序的流程,那么可以选择 Flask,如果说 Django 是具备半自动驾驶的大型车,那么 Flask 就是让你自由操纵的手动挡小汽车。

FastAPI

FastAPI 是用于构建 Web API 的现代、开源、快速、高性能的 Web 框架,它基于Python 3.6+ 标准类型提示,支持异步,正如它的名字,FastAPI 就是为构建快速的 API 而生。

优点

自动类型检查。这意味着更少的 Bug,即使在深度嵌套的 JSON 请求中,Fast API 也会验证开发人员的数据类型。

集众所长,站在巨人的肩膀上。FastAPI 建立在 JSON Schema(用于验证JSON数据结构的工具),OAuth 2.0(用于授权的行业标准协议)和OpenAPI(这是可公开获得的应用程序编程接口)之类的标准之上。

现代化。FastAPI 使使用称为 graphene-python 的 Python 库轻松构建 GraphQL API

快速、高性能。可以和 NodeJS 和 Go 相提并论。

缺点

由于 FastAPI 相对较新,因此与其他框架相比,社区较小,第三方的教程相对较少。

用例

FastAPI 适用于构建高性能的 API,本身支持异步,如果要构建异步 API,可以优先选择 FastAPI。Netflix 将其用于内部危机管理。它还可以在部署准备就绪的机器学习模型时完美缩放,因为当 ML 模型封装在 REST API 并部署在微服务中时,它在生产中会发挥最佳作用。

比较

我们从软件包,社区,性能,灵活性,职位空缺和培训来进行比较。

软件包丰富程度。Django 具有使代码可重用的大多数软件包,是一个完整的 Web 开发框架,而 Flask 和 FastAPI 是用于构建网站的简约框架,很多功能比如用户系统,后台管理要自己实现。

社区活跃程度。Django 社区是最活跃的社区,这是因为它使用广泛,很多大厂使用,另一方面,Flask 的社区也很繁荣,仅次于 Django。FastAPI 的社区目前还比较小,因为它相对较新。

性能。在性能方面,FastAPI 是领跑者,因为它是面向速度的,其次是 Flask,最后是 Django。

灵活性。灵活性是开发人员非常重视的东西,并且 Flask 比 Django 更灵活。另一方面,FastAPI 在代码方面是灵活的,并且不限制代码布局。因此,我们可以说 Flask 在这三者中是最灵活的。

职位空缺。毫无疑问,Python 网络生态系统中有 Django 要求的职位空缺更多,其次是 Flask,最后是 FastAPI,其数量要少得多,因此,如果你打算快速找到工作,那么 Django 应该是你的首选。

学习成本。FastAPI < Flask < Django。Django 虽然学习起来比较费劲,但是有完善的官方文档和很多在线资料和资源。Flask 既简单又直接,也有丰富的在线资料和资源。而 FastAPI 学习起来更简单直接,不过资源相对较少,因为还需要时间。

最后的话

仔细比较之后,你也许可以选择最适合你的那一个。总而言之,如果你想构建健壮的全栈式网站,那么 Django 是完美的选择,因为它具有多种功能并且在生产中运行良好。

对于需要快速原型化 Web 应用程序并轻松快速地构建 API 的机器学习工程师或开发人员而言,Flask 是理想的选择。

如果你正在寻找速度或可伸缩性,FastAPI 是完美的选择。根据你要使用的框架来选择框架始终是明智的选择。

但是总的来说,它们都很好并且有很好的市场需求。

如果觉得不错,请点赞、分享、关注「Python七号」,学习更多 Python 技术。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django,Flask ,FastAPI 怎么选? 的相关文章

  • 从 python 发起 SSH 隧道时出现问题

    目标是在卫星服务器和集中式注册数据库之间建立 n 个 ssh 隧道 我已经在我的服务器之间设置了公钥身份验证 因此它们只需直接登录而无需密码提示 怎么办 我试过帕拉米科 它看起来不错 但仅仅建立一个基本的隧道就变得相当复杂 尽管代码示例将受
  • 使用鼻子获取设置中当前测试的名称

    我目前正在使用鼻子编写一些功能测试 我正在测试的库操作目录结构 为了获得可重现的结果 我存储了一个测试目录结构的模板 并在执行测试之前创建该模板的副本 我在测试中执行此操作 setup功能 这确保了我在测试开始时始终具有明确定义的状态 现在
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • Numpy 过滤器平滑零区域

    我有一个 0 及更大整数的 2D numpy 数组 其中值代表区域标签 例如 array 9 9 9 0 0 0 0 1 1 1 9 9 9 9 0 7 1 1 1 1 9 9 9 9 0 2 2 1 1 1 9 9 9 8 0 2 2 1
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • 在 Spring Boot Actuator 健康检查 API 中启用日志记录

    我正在使用 Spring boot Actuator APIproject https imobilenumbertracker com 拥有一个健康检查端点 并通过以下方式启用它 management endpoints web base
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • 如何在 python 中没有 csv.reader 迭代器的情况下解析单行 csv 字符串?

    我有一个 CSV 文件 需要重新排列和重新编码 我想跑 line line decode windows 1250 encode utf 8 在由 CSV 读取器解析和分割之前的每一行 或者我想自己迭代行 运行重新编码 并仅使用单行解析表单
  • python Soap zeep模块获取结果

    我从 SOAP API 得到如下结果 client zeep Client wsdl self wsdl transport transport auth header lb E authenticate self login res cl
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • 如何在 Quartz 调度程序中每 25 秒运行一次?

    我正在使用 Java 的 Quartz Scheduling API 你能帮我使用 cron 表达式每 25 秒运行一次吗 这只是一个延迟 它不必总是从第 0 秒开始 例如 序列如下 0 00 0 25 0 50 1 15 1 40 2 0
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • 挂钩 Eclipse 构建过程吗?

    我希望在 Eclipse 中按下构建按钮时能够运行一个简单的 Java 程序 目前 当我单击 构建 时 它会运行一些 JRebel 日志记录代码 我有一个程序可以解析 JRebel 日志文件并将统计信息存储在数据库中 是否可以编写一个插件或
  • 迭代 my_dict.keys() 并修改字典中的值是否会使迭代器失效?

    我的例子是这样的 for my key in my dict keys my dict my key mutate 上述代码的行为是否已定义 假设my dict是一本字典并且mutate是一个改变其对象的方法 我担心的是 改变字典中的值可能
  • 具有自定义值的 Django 管理外键下拉列表

    我有 3 个 Django 模型 class Test models Model pass class Page models Model test models ForeignKey Test class Question model M
  • 字典和数组作为类变量与实例变量

    这是赚取积分的简单方法 请解释以下内容 class C a b 0 c def init self self x def d self k v self x k v self a k v self b v self c append v d
  • Java &= 运算符应用 & 或 && 吗?

    Assuming boolean a false 我想知道是否这样做 a b 相当于 a a b logical AND a is false hence b is not evaluated 或者另一方面 这意味着 a a b Bitwi
  • 列表值的意外更改

    这是我的课 class variable object def init self name name alias parents values table name of the variable self name 这是有问题的函数 f
  • Scrapy Spider不存储状态(持久状态)

    您好 有一个基本的蜘蛛 可以运行以获取给定域上的所有链接 我想确保它保持其状态 以便它可以从离开的位置恢复 我已按照给定的网址进行操作http doc scrapy org en latest topics jobs html http d

随机推荐

  • 【狂神说】Mybatis学习笔记(全)

    狂神说 Mybatis最新完整教程IDEA版参考链接 https www bilibili com video BV1NE411Q7Nx 狂神说 Java学习完整路线https www bilibili com read cv5702420
  • 用户输入一行明文(字符串),针对字母进行加密(偏移量设置为 3),非字母部分保留原型。

    要求 用户输入一行明文 字符串 针对字母进行加密 偏移量设置为 3 非字母部分保留原型 include
  • uniapp获取用户数据昵称为“微信用户”(小程序)@杨章隐

    原文 微信小程序获取用户信息nickname为 微信用户 Web Try harder的博客 CSDN博客 小程序获取昵称是微信用户 原因 微信 公众平台调整了相关策略 开发者调用type getuserinfo 和直接调用wx getus
  • .Error (10200): Verilog HDL Conditional Statement error at : cannot match operand(s) in the conditio...

    always 记得初始化使用数据 加上 if rst n 不要直接接if dsp xint1 转载于 https www cnblogs com navieli archive 2013 03 11 2954183 html
  • 【Mo 人工智能技术博客】使用 Seq2Seq 实现中英文翻译

    1 介绍 1 1 Deep NLP 自然语言处理 Natural Language Processing NLP 是计算机科学 人工智能和语言学领域交叉的分支学科 主要让计算机处理或理解自然语言 如机器翻译 问答系统等 但是因其在表示 学习
  • python计算高德地图距离和面积

    python计算高德地图距离和面积 因为项目中经常使用高德的距离和面积计算组件 但是高德并未公布计算逻辑 这就导致项目中数据出问题时不知道该如何去定位 因此花费了1天时间把距离计算和面积计算用python语言整理了出来 距离计算公式 fro
  • VUE首屏加载loading效果

    在使用乾坤微前端框架中 遇见图片资源路径存在访问问题 在不搭CDN的情况下 使用base64方式将图片资源打入代码 这样会导致包体积过大 加载时间长 所以加了一个loading效果 1 在index html入口增加 loading li
  • @Profile使用及SpringBoot获取profile值

    之前开发用过 maven 的环境隔离 现在使用springboot的 Profile功能 发现spring体系真的大到我只是学习了皮毛 相比面试问的 IOC bean的作用域等 突然觉得很可笑 官方文档关于 Profile 的使用 http
  • 删除两个字典中非公共的键和值

    删除两个字典中非公共的键和值 需求 对比两个字典 找出公共元素 将非公共元素删除 dict1 dict2 res for i in dict1 if i not in dict2 print i del dict1 i res append
  • Vue3项目中使用TypeScript

    单文件用法 在单文件组件中使用 TypeScript 需要在 小结 注意 当 script 中使用了 ts 模板 template 在绑定表达式时也支持ts 如果在表达式中不指名类型时 编译器会报警告提示 正确写法 表达式指定类型 组合式A
  • 一文说清楚c++模板Template的用法

    一 引言 模板 Template 指c 程序设计语言中采用类型作为参数的程序设计 二 函数模板 1 通用格式 函数模板定义格式 template
  • Git:同步他人的远程仓库至自己的Git服务器并自动定时更新

    昨天晚上将2015年一篇不负责的Git服务器搭建的教程更新了一下 详见 在CentOS下搭建自己的Git服务器及使用nginx配置gitweb面板 今天折腾了一些本地的项目 倒是可以了 现在的需要是 将远程的仓库 同步一份到自己的git服务
  • C#复习题1(含答案及解析)

    1 单选题 下面有关for循环的正确描述是 A for循环只能用于循环次数已经确定的情况 B for循环的执行流程是先执行循环体语句 后判断表达式 C 在for循环中 表达式1和3可以省略 但表达式2是不能省略 D for循环的循环体中 可
  • JVM黑马版:笔记、应用、速查

    前言 由于工作中时常和JVM打交道 但是对JVM的体系缺乏系统深入了解 日前跟随b站上黑马程序猿的课程成体系地学习了JVM 结合工作中的实践写就了此笔记 黑马原视频地址 https www bilibili com video BV1yE4
  • 无域名家庭异地组网 Headscale +自建 DERP 中继服务器

    参考资料 Headscale 自部署 Tailscale 服务端 泠泫凝的异次元空间 lxnchan cn 20条消息 比 Tailscale 更好的内网穿透方案 Headscale 米开朗基杨的博客 CSDN博客 156条消息 自建 DE
  • Microsoft Access database engine 2010 (Chinese (Simplif... 您不能安装64位版本的Microsoft Access 2010 数据库引擎

    问题 Microsoft Access database engine 2010 Chinese Simplif 您不能安装64位版本的Microsoft Access 2010 数据库引擎 因为您当前已安装32位的offce 产品 若要安
  • Python render_notebook()画图不显示

    关注微信公共号 小程在线 关注CSDN博客 程志伟的博客 使用jupyter lab画图 render notebook 画图不显示 解决方法 from pyecharts globals import CurrentConfig Note
  • p值小于0.05拒绝还是接受_数据科学20

    1 假设检验 假设检验用来判断样本与样本 样本与总体的差异是由抽样误差引起还是本质差别造成的统计推断方法 零假设H0 差异是由抽样误差引起的 一般形式是假定参数等于某个固定值 如假设组间差异为0 回归系数为0等 备择假设H1 存在本质差异
  • 伺服电机脉冲控制方式

    伺服电机脉冲控制方式 伺服电机控制方式有脉冲 模拟量和通讯控制这三种 在不同的应用场景下 该如何确定选择伺服电机控制方式 1 伺服电机脉冲控制方式 在一些小型单机设备 选用脉冲控制实现电机的定位 应该是最常见的应用方式 这种控制方式简单 易
  • Django,Flask ,FastAPI 怎么选?

    阅读大约需要 4 5 分钟 首先我们达成一个共识 框架是用来帮助我们提升效率 节省时间 避免处理那些低级细节的 如果能达到这个目标 就是一个合适的框架 选择合适的框架 会事半功倍 Python 领域 开发 Web 应用程序的三个主流框架是