Django,Flask ,FastAPI 怎么选?-程序员宅基地

技术标签: python  java  编程语言  人工智能  大数据  

阅读大约需要 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 技术。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/somenzz/article/details/116247279

智能推荐

JAVA复习笔记02-程序员宅基地

文章浏览阅读122次。16、interface中的成员变量默认为public static final类型,方法只能是public(默认为public)17、内部类访问外部类成员:Outer.this.num;18、一道有趣的题目  使用内部类实现该程序。(答案附在本文末尾)interface Inter { void show();}clas..._public

智慧交通与汽车智能化构建“交通强国”-程序员宅基地

文章浏览阅读1k次。智慧交通正在成为新基建的主力军,伴随着新能源汽车和汽车融入智能制造产业链的结构性深化,智慧交通产业构架成为中国经济发展进入新常态下融入碳中和、碳达峰的绿色发展和以新基建为代表的的中国智能制..._智能交通 智慧交通 芯片

阿里云服务器在docker上部署MySQL(图文详细教程)_阿里云服务器docker安装数据库-程序员宅基地

文章浏览阅读1.4k次。阿里云服务器在docker上部署MySQL(图文详细教程)设置容器、运行容情做数据挂载、端口映射、目录映射。_阿里云服务器docker安装数据库

Openjudge:向量点积计算_python 给定两个n维向量a=(a1,a2,...,an)和b=(b1,b2,...,bn),求-程序员宅基地

文章浏览阅读1.5k次。描述在线性代数、计算几何中,向量点积是一种十分重要的运算。给定两个n维向量a=(a1,a2,…,an)和b=(b1,b2,…,bn),求点积a·b=a1b1+a2b2+…+anbn。输入第一行是一个整数n。1 <= n <= 1000。第二行包含n个整数a1,a2,…,an。第三行包含n个整数b1,b2,…,bn。相邻整数之间用单个空格隔开。输出一个整数,即两个向量的点积结果。样例输入31 4 62 1 5样例输出36n = int(input())s = li_python 给定两个n维向量a=(a1,a2,...,an)和b=(b1,b2,...,bn),求点积a·b=a1b1+a2b

Openjudge:求三个数的和_python如果三个数全部是整数,则结果也是整数。如果三个数中有小数,则结果-程序员宅基地

文章浏览阅读3.8k次。描述输入三个整数或小数,输出它们的和如果结果是整数,就保留小数点后面一位的0(用python写则不用特别处理,程序自然会如此)输入​输入三个整数或小数输出和样例输入1 2.3 4.7样例输出8.0代码:s = input().split()a = float(s[0])b = float(s[1])c = float(s[2])print(a+b+c)..._python如果三个数全部是整数,则结果也是整数。如果三个数中有小数,则结果

最简单的视音频播放示例7:SDL2播放RGB/YUV_用c语言调用sdl2播放yuv-程序员宅基地

文章浏览阅读627次。//////////////转载:雷神博客http://blog.csdn.net/leixiaohua1020/article/details/40525591/////////////本文记录SDL播放视频的技术。在这里使用的版本是SDL2。实际上SDL本身并不提供视音频播放的功能,它只是封装了视音频播放的底层API。在Windows平台下,SDL封装了Direct3D_用c语言调用sdl2播放yuv

随便推点

android,ListView_zy-2021-10-21-0119-程序员宅基地

文章浏览阅读999次。Activity页public class MainActivity extends AppCompatActivity { private ListView mlv1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);_zy-2021-10-21-0119

DOMJavascript总结_javascript curtd-程序员宅基地

文章浏览阅读1.6k次。1,动态设置事件: function F1(){ alert('In F1'); } function F2{ alert(In F2); }_javascript curtd

R语言ggplot2可视化:使用ggplot2可视化散点图、使用labs参数自定义X轴的轴标签文本(customize X axis labels)_r语言中的labs()的用法-程序员宅基地

文章浏览阅读685次。R语言ggplot2可视化:使用ggplot2可视化散点图、使用labs参数自定义X轴的轴标签文本(customize X axis labels)_r语言中的labs()的用法

What is the difference between L1 and L2 regularization?_the differences between l1 snd l2-程序员宅基地

文章浏览阅读4.1k次。今天讨论班一个师姐讲到L1 norm还有L2 norm 的regularization问题,还有晚上和一个同学也讨论到这个问题,具体什么时候用L1,什么时候用L2,论文上写道一般当成分中有几个成分是principal factor的时候我们会使用L1 norm penalty,但是为什么L1会有这个效果。一个网上的讨论:http://www.quora.com/Machine-Lear_the differences between l1 snd l2

Java抽象类/抽象方法定义及其特性详解_抽象方法怎么定义-程序员宅基地

文章浏览阅读8.7k次,点赞13次,收藏40次。类的继承结构中,越往上的类越具有通用性,也就越抽象。当它抽象到一定程度,就变成概念成框架,不能再产生实例化的对象了。例如“交通工具”,就无法用它来产生一个实例。对应这一现象,Java中提供了抽象类,它只能作为父类,不能实例化。定义抽象类的作用是将一类对象的共同特点抽象出来,成为代表该类共同特性的抽象概念,其后在描述某一具体对象时,只要添加与其他子类对象的不同之处,而不需要重复类的共同特性。这样就使得程序概念层次分明,开发更高效。与抽象类紧密相连的是抽象方法一它总是用在抽象类或接口中。_抽象方法怎么定义

从海外客户端Bidding看,移动开发者应如何应对竞价模式变化?_admob竞价和瀑布的区别和文档-程序员宅基地

文章浏览阅读2.0k次。从海外客户端Bidding看,移动开发者应如何应对竞价模式变化2021年,对于渴望通过广告进行变现的移动开发者来说,可能注定是风云变幻的一年,也将是移动互联网广告程序化购买这个行业程碑式的一年,对此很多国内出海开发者会有更早的感触。自2020年三四季度始,大洋彼岸的美国就掀起了一轮“移动流量的客户端竞价革命”。其实,对于流量竞价(Realtime Bidding)很多PC时代的开发者并不陌生,简而言之,流量竞价就是APP的每一次广告曝光的机会都可以分发至多个买方平台,比如DS、Adnetwork_admob竞价和瀑布的区别和文档

推荐文章

热门文章

相关标签