草庐IT

Flask 与 Django 框架对比

Leon-2012 2024-06-17 原文

详细分析了两种 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. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  2. ruby - sinatra 框架的 MVC 模式 - 2

    我想开始使用“Sinatra”框架进行编码,但我找不到该框架的“MVC”模式。是“MVC-Sinatra”模式或框架吗? 最佳答案 您可能想查看Padrino这是一个围绕Sinatra构建的框架,可为您的项目提供更“类似Rails”的感觉,但没有那么多隐藏的魔法。这是使用Sinatra可以做什么的一个很好的例子。虽然如果您需要开始使用这很好,但我个人建议您将它用作学习工具,以对您来说最有意义的方式使用Sinatra构建您自己的应用程序。写一些测试/期望,写一些代码,通过测试-重复:)至于ORM,你还应该结帐Sequel其中(imho

  3. STM32的HAL和LL库区别和性能对比 - 2

    LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L

  4. ruby-on-rails - 正确了解 Rails 框架的最佳方式是什么? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我一直在Rails上做两个项目,它们运行良好,但在这个过程中重新发明了轮子,自来水(和热水)和止痛药,正如我随后了解到的那样,这些已经存在于框架中。那么基本上,正确了解框架中所有智能部分的最佳方法是什么,这将节省时间而不是自己构建已经实现的功能?从第1页开始阅读文档?是否有公开所有内容的特定示例应用程序?一个特定的开源项目?所有的rails交通?还是完全

  5. ruby - 自动将院子文档框架添加到现有的 Rails 遗留代码中 - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭4年前。Improvethisquestion我希望能够将模板化的YARD文档样式注释插入到我现有的Rails遗留应用程序中。目前它的评论很少。我想要具有指定参数的类header和方法header(通过从我假定的方法签名中提取)和返回值的占位符。在PHP代码中,我有一些工具可以检查代码并在适当的位置创建插入到代码中的文档header注释。在带有Ducktyping等的Ruby中,我确信诸如@params等类型之类

  6. ruby-on-rails - 具有六边形架构和 DCI 模式的框架和数据库适配器 - 2

    我尝试用Ruby设计一个基于Web的应用程序。我开发了一个简单的核心应用程序,在没有框架和数据库的情况下在六边形架构中实现DCI范例。核心六边形中有小六边形和网络,数据库,日志等适配器。每个六边形都在没有数据库和框架的情况下自行运行。在这种方法中,我如何提供与数据库模型和实体类的关系作为独立于数据库的关系。我想在将来将框架从Rails更改为Sinatra或数据库。事实上,我如何在这个核心Hexagon中实现完全隔离的rails和mongodb的数据库适配器或框架适配器。有什么想法吗? 最佳答案 ROM呢?(Ruby对象映射器)。还有

  7. ruby-on-rails - 在 Ruby on Rails 中验证 Django 密码给出不匹配的密码 - 2

    我正在用RubyonRails重写Django应用程序,并希望为用户保留旧密码。Django使用PBKDF2SHA1作为加密机制。所以我有一个加密密码是这个pbkdf2_sha256$10000$YsnGfP4rZ1IZ$Tpf4922MoNEjuJQA9EG2Elptyt3dMAyzBPUgmunFOW4=原密码是2bulls在Ruby中,我使用PBKDF256gem和base64进行检查。Base64.encode64PBKDF256.dk("2bulls","YsnGfP4rZ1IZ",10000,32)我很期待Tpf4922MoNEjuJQA9EG2Elptyt3dMAyzBP

  8. python - Ruby 是否有相当于 Python 的扭曲框架作为网络抽象层? - 2

    据我了解,Python的扭曲框架为网络通信提供了更高级别的抽象(?)。我正在寻找在Rails应用程序中使用与twisted等效的Ruby。 最佳答案 看看EventMachine.它不像Twisted那样广泛,但它是围绕事件驱动网络编程的相同概念构建的。 关于python-Ruby是否有相当于Python的扭曲框架作为网络抽象层?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/9

  9. ruby-on-rails - 使用 Rails 以外的 Ruby 框架是否有任何潜在的缺点? - 2

    我想使用比Rails(Sinatra/Ramaze/Camping)更轻的框架,但我担心这样做我将无法使用许多以插件形式为Rails定制的共享库.这是一个主要问题,还是这些插件中的大多数都可以跨不同的Ruby框架使用?使用Ruby框架而不是Rails是否还有其他潜在的缺点? 最佳答案 您仍然可以使用gems在你提到的所有框架中,很多东西都是可重用的。想要交换一个新的ORM,没问题。想要一个花哨的shmacy语法高亮,没问题。Rails一直在大力插入摆脱旧的插件模型,转而使用gems。如果其他框架之一符合您的需求,最好使用它。请记住,

  10. 基于python的短视频智能推荐/django的影视网站/视频推荐系统 - 2

    摘要本论文主要论述了如何使用Python技术开发一个短视频智能推荐,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述短视频智能推荐的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计。 短视频智能推荐的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、热门视频管理、用户上传管理、系统管理,用户:首页、个人中心、用户上传管理、我的收藏管理,前台首页;首页、热门视频、用户上传、公告信息、个人中心、后台管理等功能。由于本网站的功能模块设计比较全面,所以使得整个短视频智能推荐信

随机推荐