详细分析了两种 Python Web框架: Flask 与 Django。从开发难易度、应用架构、性能、可扩展性以及适用范围等方面进行了详细说明。

Django 中级教程在 B 站上线,深入解析 Django 体系架构,实现从入门到精通的跨越。在线教程

前言

基于 Github 排名第二的程序设计语言 - Python,有许多可用的 Web 框架,Django 与 Flask 是两个独立的 Python 框架,为开发者解决许多复杂低层代码问题。通常来讲 Django 常应用于全栈应用开发,而 Flask 常于服务架构。


一、Flask 概述

Flask 由澳大利亚工程师 Armin Ronacher 创建,是一个轻量级的微服务框架,让开发者可以自由选择设计模式、数据库及工具。它的学习成本小,适用于构建可扩展的 Web应用。
Flask 使用下面两个协议来实现 Web 通讯以及网站的展示层:

  • WSGI: 用于与 web 服务器的通讯。
  • jinja2: 用于 Web 服务的展现层网站界面设计。

1. 适用场景

  • 小规模、低复杂度的项目
  • 集成机构学习或深度学习应用
  • 无服务器的计算
  • 无数据库或 NoSQL数据库服务
  • 静态或 RESTful web 服务

2.Flask 案例

  • Netflix 使用 Flask APIs 实现局部故障转移以及流星分配。
  • Airbnb 在其 Airflow 项目中使用Flask,并基于 Flask-admin 库增加了管理界面。
  • Uber 使用 Flask 来优化控制、实现动态价格和司机位置定位。
  • Lyft 使用信号模块为 web 用户交互提供数据。
  • Pinterest 是使用 Flask 构建大规模网站的开发之一,它在可扩展财富生态系统中使用 Flask 。
  • Twilio 使用 Flask 在短时间内开发出公有和私有基于 REST 搞用的API。

二、Django 概述

Django 是由工作于Lawrence Journal-World 报社的 Adrian Holovaty 和 Simon Willison 创建,命名来自于著名吉他手 Django Reinhardt。2003年开始,2008年发布第一个版本。
Django 为开发者提供全栈开发架构,使开发者可以快速安全的构造 Web 应用。本身提供众多的功能用于构造完整应用,支持众多格式(HTML、RSS、JSON、XML等等)。另外 Django 提供安全框架和易于大规模部署的架构。

1. 适用场景

  • 需要 ORM 支持的 Web 应用
  • API 后端开发
  • 大规模可扩展的应用
  • 集成 ML
  • 数据驱动的应用

2. 典型应用

  • Disqus: 博客应用,每月处理来191个国家超20亿用户的 5 千万评论和170亿的点击量。全站都是基于 Django 开发,在创建以后非常易于扩容。
  • Spotify: 实现音乐分享,有来自全球的用户同时使用其后台及机器学习系统。
  • Mozilla: 切换到 Python 及 Django 架构来满足不断增长的流量及 API 访问。
  • Dropbox: 实现一系列功能,如用户历史、跨设备访问同步、各种文件分享功能等。
  • Instagram: 使用 Django 在不修改和中断用户界面操作的情况下来满足不断增加的访问流量。

三、优缺点

1. Flask优点

  • 简单易学: 开发者可以快速掌握 Web 开发,学习、开发、维护应用都相对容易。
  • 易于构建原型: 架构抽象层次较少,让开发者可以快速构建原型。
  • 代码库小: 基础库代码少,有效降低应用的大小。
  • 灵活: 开发者可以按需将外部元素加入到项目之中。架构没有严格的设计模式、协议及数据库要求。每个部件可灵活替换。

2. Flask 缺点

  • 构建复杂系统过程较繁琐: 在特别复杂系统里开发者需要引入过多的第三方库,造成代码库维护麻烦。
  • 处理多请求时开销比较大: 由于没有内置的异步机制,处理大量请求时会花费过多的时间。
  • 安全风险: 由于内置功能较少而引用大量的第三方工具库,对系统的安全带来较大风险。
  • 维护成本高: 在长期运行及开发过程中,维护过多的第三方库(例如库的废弃、不兼容)会带来昂贵的成本。

3. Django 优点

  • 快速开发: 开发者利用自带丰富的标准库大大减少开发时间,利用产品快速上线。
  • 扩展好: 提供许多管理工具满足系统规模和用户增长的需求,可轻松扩展满足百万级用户访问请求。
  • 安全性高: 提供众多内置安全工具,保证应用不受常见的跨站攻击、SQL注入等漏洞影响。
  • 灵活性好: 开发中大量工具库及软件库隐藏了开发实现的细节,应用可以根据市场需求快速实现应用功能转换。
  • 对机器学习友好: 计算和统计能力使得架构更易于实现机器学习算法。开发者较容易向应用中加入高级功能并实现定制开发。
  • 众多开发者: 使用最流行的 Python 语言开发, 有大量的开发者支持,社区资源也丰富丰富。

4. Django 缺点

  • 不太适合较小规模的项目: Django 是代码密集型框架,会占用较多机器性能及网络带宽。如果项目规模在未来不会扩展太大,学习和使用的成本会较高。
  • 每次处理一个请求: 不像其它常用的框架,Django 本身是单任务,不能同时并发处理多个请求,而且开发者难通过底层代码修改来提供并发处理功能。(Django生产环境通过 Web 服务器多线程及消息队列等能实现应用级别的多请求及异步处理)
  • 发展较慢:Django框架较庞大,各个模块耦合度高,为了向前兼容,制约框架总体开发及迭代速度。

四、性能及速度对比

Flask 在处理 JSON格式的请求及返回时速度很快。它能快速构建 MVP 模式的应用, 同其它 Python 框架相比,轻量化、高性能、开发栈简单是它的一大特点。对于追求高效开发过程有时并不适合。下图是性能测试的对比图:

Django 不是性能最高的框架。所以接下来的问题,应用到底需要多少的运行速度? 在不正确使用 Django 的情况,会造成一些处理上的瓶颈,例如:高并发的 JSON 序列化请求、频繁的数据库与 Python 对象转换、通过中间处理请求。
但事实上,这些问题可以通过良好的开发规范、合理硬件部署以及鉴别优化核心功能点来解决。下图是 Django 与其它语言在不同规格机器上的性能测试结果:

五、其它比较

1. 应用架构

  • Flask 对应用的设计及体系结构没有硬性要求。它只提供了一个结构应用实现的蓝图。代码按可复用组件方式组织,由它是微服务架构,不涉及展现层的实现细节。
  • Django 遵循 MVT (Model View Template,模型视图模板) 系统架构,是常见 MVC 的一个变种。两种架构最大的区别是模板文件包含 HTML 及 Django 模板语言来动态升成 Web 网站。在用户有个性化界面需求时,实现起来会非常方便,例如 Instagram。

2. 可扩展性

  • Flask 基于数据存储支持提供良好的可扩展性,服务器数量增加时可加倍提升数据处理性能。但对支持全局代理以及本地代理(如线程、进程和greenlet)服务器,Flask 并没提供相应工具支持,它限制了Flask的可扩展性。
  • Django 高并发的典型案例是 OpenStack、Washington Post、Instagram、Spotify 等等。这些大型互联网应用体现出它的可扩展能力。它可以和许多运维优化技术结合使用来改善情能及加载时间,对于数据库、图像以 CSS等都是提供了优化工具。基于 Django 可以允分发挥 CDN 和云服务的解决方案能力, Django 管理工具可完成这些操作功能而不影响应用代码,在远期对可扩展性有要求情况下,Django 是一个不错的框架。

3. 易于测试能力比较

  • 为了能支持不同架构的 Python 应用模式, Flask 提供了易于实现应用测试的能力,可以使用 Werkzeug 测试客户端处理单元测试。它还可以与 pytest 或 unittest 结合使用,另外还有一些 Flask-Testing 扩展模块支持外部单元测试工具。
  • Django 在测试方面也不成问题,它提供一系列简化测试代码编写过程,它提供丰富的文档来说明测试站点的方法。开发者可轻松实现逻辑层测试并及提供无错误的最终产品。

4. 微服务兼容性

Flask 在构建微服务时有如下两种模式:

  • i.) 不使用额外设计模式或依赖包。开发者使用自身插件就能来部署高性能微服务。
  • ii.) 它还提供 flask_nameko 包装器与 Nameko 配合实现微服务架构。
    两种模式都是构建微服务的有效方法。
    Django 自然也提供微服务的快速开发功能,它内置了安全、可扩展的微服务后端模块。典型的 Django 项目可以由微模块组成,在系统架构设计上合理规划微服务模块可以充分利用Django的微服务框架。在很多情况下,Django 微服务是为了将 ML(机器学习)功能引入到开发项目中。

5. 数据库支持

  • Flask 与数据库无直接关联,开发者可以自由选择数据库及适配器。Flask 使用 DbAdapters 来支持不同数据库,它使用 SQLALchemy 来支持众多基于 SQL 数据库,使用 MongoDbAdapter 来访问 MongoDB 数据库。在 DbAdapters 基础上开发者可以扩展以支持更多类型数据库。
  • Django 官方提供对 PostgreSQL, MariaDB, MySQL, Oracle, 及 SQLite 的数据库支持,通过第三方包可以实现与其它数据库的对接。 另外 Django 还提供多数据源连接支持,其模型与数据库对象转换、迁移工具极大方便了数据模型设计与同步。可以负责的讲,对于 Web站点及应用,Django 都是很好的数据库工具。

六、结论

Django 及 Flask 都是构建高质量应用的常用框架,使用中需要综合分析然后加以选择。

1. Flask 适用的场景

  • 对于较短开发周期时,Flask 更易于学习上手开发。
  • 项目并不需要全栈(前端、后端、数据库)完成支持。
  • 开发原型或进行初步验证。
  • 小规模不复杂的项目。
  • 构建无服务应用
  • 构建静态或 RESTful Web 服务.

2. Django 适用场景

  • 构造可定制、动态变化的社交媒体网站。
  • 具有高度个性化并集成机器学习( ML)功能的应用。
  • 构建类似电子商务平台的 CRM 或订单处理引擎。
  • 构建安全的 B2B 应用。
  • 构建数据驱动的旅游、食品或医院健康应用。
  • 构建数据分析及可视化应用。

Flask 与 Django 框架对比相关推荐

  1. 师傅带徒弟学:Python Web之Django框架-关东升-专题视频课程

    师傅带徒弟学:Python Web之Django框架-475人已学习 课程介绍         Python Web是Python语言一个重要的应用方面,Python Web有很多,其中Flask和D ...

  2. Flask与Django对比

    Flask与Django对比 Django vs Flask Flask 框架之间的差别 Django功能大而全,Flask只包含基本的配置 Django的一站式解决的思路,能让开发者不用在开发之前就 ...

  3. 关于Django框架和Flask框架的区别。

    目录 1.基本介绍 2.项目结构 3.流行度 4.实际工作中如何选择这两个框架? 关于Django和Flask这两个框架来说,都是Python的web开发中两个常用的框架,但是这两个框架有什么区别呢? ...

  4. python的django框架与springboot_Python系统教学|为什么Django框架在Python开发很重要?...

    Django框架在Python开发很重要,Django框架是一个web框架,且是一个后端框架程序,它不是服务器,需要注意Django框架帮我们封装了很多的组件,帮助我们实现各种功能,具有很强的扩展性. ...

  5. Django框架基础知识点

    Django框架 1.Django创建项目的命令 django-admin startproject 项目名称 python manage.py startapp 应用app名 2.Django创建项 ...

  6. python的django框架是干嘛的_Django框架在Python开发很重要为什么?

    Django框架在Python开发很重要,Django框架是一个web框架,且是一个后端框架程序,它不是服务器,需要注意Django框架帮我们封装了很多的组件,帮助我们实现各种功能,具有很强的扩展性. ...

  7. 自学Python第二十二天- Django框架(一)创建项目、APP、快速上手、请求和响应流程、模板、数据库操作

    Django 框架是一个基于 python 的重量级的 web 开发框架,现今很多大公司大项目都是使用 Django 框架.采用了 MVC(model view controller) 的框架模式,p ...

  8. Django 框架 要点

    Python Web 框架要点 1. Web应用程序处理流程 2. Web程序框架的意义 用于搭建Web应用程序 免去不同Web应用相同代码部分的重复编写,只需关心Web应用核心的业务逻辑实现 3. ...

  9. Django框架介绍及配置

    Django框架介绍及配置 一, WEB框架介绍 1.1Web应用程序处理流程 1.2Web框架程序的意义 用于搭建Web应用程序 免去不同Web应用相同代码部分的重复 1.3 Web应用程序的本质 ...

  10. python web开发框架flask_Python Web 开发框架,Flask 与 Django那个更好

    本文把 Flask 和 Django 做一个比对,因为我对这两个 Python Web 框架都有实际的开发经验.希望我可以帮助您选择学习哪个框架,因为学习一个框架可能会非常耗时 -- 当然也很有趣! ...

最新文章

  1. Android源码大全
  2. python安装scipy
  3. clob类型用java怎么存,Java 储存和读取 oracle CLOB 类型字段的实用方法
  4. 微软发布XAML Studio工具:快速构建UWP XAML原型
  5. echarts 卡_图表太丑怎么破,ECharts神器带你飞!
  6. linux usb 驱动漏洞,不测不知道 这么多的USB漏洞要从何“补”起?
  7. 学编程必备的三个网站
  8. 利用预渲染加速iOS设备的图像显示
  9. LeetCode 396. 旋转函数(Rotate Function)
  10. 完全弄懂如何用pycharm安装pyqt5及其相关配置
  11. 京东月薪8万招聘HR,岗位要求只有这3个字
  12. 【操作系统/OS笔记15】死锁的系统模型,死锁的处理办法,银行家算法与死锁检验算法
  13. python解决一些错误换行问题
  14. 12864液晶模块的详细使用
  15. 合作博弈:夏普利值(shapley value)性质与算法
  16. 黑客郭盛华虚假新闻_每日新闻摘要:黑客闯入十个电信网络
  17. onBlur和onChange冲突解决方法
  18. Android平台渗透测试套件--zANTI2.5
  19. 计算机大学生三好学生申请书,大学生三好学生申请书
  20. java.lang.AssertionError: Activity needs to be set if initial lifecycle state is resumed

热门文章

  1. Arduino UNO AT24C32进行单字节数据读写
  2. java docx4j 使用教程_docx4j深入学习整理
  3. Java中List集合去重
  4. js中的几种随机排序方案
  5. oracle启动pmon,oracle 11g pmon工作内容系列三
  6. 600个超实用ICON图标矢量
  7. 人大金仓数据库(kingbase7d)操作入门指南
  8. 如何在cad中模块计算机,cad中家具模板哪里找(怎么在CAD图纸里面加入家具)
  9. sqlserver Change Data CaptureChange Tracking
  10. SLAM大牛实验室汇总(转载)