素材巴巴 > 程序开发 >

Django vs Flask: 听RealPython创始人说到底应该选哪个?

程序开发 2023-09-15 12:11:28

根据2020年JetBrains Python开发人员调查,Django和Flask是迄今为止最受欢迎的两个Python Web框架。考虑到Web开发行业在过去五年左右的时间里一直朝着较小的框架,微服务和“无服务器”平台发展的趋势,Flask超越了Django成为榜首也就不足为奇了。

也许这与行业趋势无关,而只与JetBrains用户有关?

Django和Flask具有成熟的社区,得到了广泛的支持和欢迎,并提供了有效的应用程序开发方法,使您可以将时间和精力集中在应用程序的独特部分上,而不是核心支架上。最后,两个框架都用于开发Web应用程序, 关键区别在于他们如何实现这一目标。可以将Django视为汽车,将Flask视为自行车。两者都可以使您从A点到达B点,但是它们的方法却大不相同。每个都有自己的最佳应用场景, Django和Flask也是如此。

在本文中,我们将从教育和开发的角度研究Django和Flask的最佳用例,以及使它们与众不同的原因。

哲学

Django和Flask都是免费的,开源的,基于Python的Web框架,旨在构建Web应用程序。

与Flask相比,Django更稳定,采用大包大揽的方式,提供了许多开箱即用的模块(例如,工具,模式,功能部件和功能)。在稳定性方面,Django具有更长,更严格的发布周期。因此,Django新版本具有较少的闪亮新功能,但具有更强的向后兼容性。

基于Werkzeug,Flask可以很好地处理核心任务。开箱即用的部分包括URL路由,请求和错误处理,模板,cookie,对单元测试的支持,调试器和一个开发服务器。由于大多数Web应用程序需要更多功能(例如ORM,身份验证和授权),因此您可以决定如何构建应用程序。无论您是利用第三方扩展还是自己定制代码,Flask都不会为此而烦扰。它比Django灵活得多。如果您需要打开盖子并查看源代码,那么可以攻击的表面积也就更少,可以查看的代码也更少。

我强烈建议您阅读和审核Flask源代码。干净,清晰,简洁,这是结构良好的Python代码的一个很好的例子。

特性

接下来,让我们根据核心框架附带的功能比较Flask和Django。

数据库

Django包含一个简单而强大的ORM(对象关系映射),它支持许多现成的关系数据库-SQLite,PostgreSQL,MySQL和Oracle。ORM为生成和管理数据库迁移提供支持。基于数据模型创建表单,视图和模板也非常容易,这对于典型的CRUD Web应用程序而言是完美的选择。尽管它确实有一些缺点,但对于大多数Web应用程序来说已经足够了。

Flask对数据的存储方式不做任何假设,但是有很多库和扩展可以帮助您:

总而言之,如果您使用的是关系数据库,则Django具有内置的ORM和迁移管理工具,因此入门起来更加容易。但是,如果您使用的是非关系数据库,或者想使用其他的ORM(例如SQLAlchemy),则Django几乎会在每个步骤中与您抗争。另外,您很可能将无法利用Django admin,模型表单或DRF模型序列化程序。

Flask不影响您的工作,让您可以自由选择最适合您的应用程序的ORM(或ODM)。但是,自由是要付出代价的:学习曲线更高,出错的空间更大,因为您可以自己管理这些部分。

您自己做的事越多,随着事情的发展就会犯更多的错误。

认证

由于大多数Web应用程序都需要身份验证(您是谁?)和授权(您被允许做什么?),因此Django提供了此功能以及帐户管理和开箱即用的会话支持(通过User模型)。Flask支持基于cookie的会话,但是您必须转向扩展网络以进行帐户管理,身份验证和授权。

管理后台(admin)

Django自带一个功能性的管理后台,它是一个Web应用程序,提供了用于基于模型管理数据的用户界面。这是Django的另一个亮点。它使您可以在构建应用程序时快速对模型执行CRUD操作,而无需编写任何其他代码。同样,Flask并未附带这样的东西,但是Flask-Admin扩展提供了所有相同的功能以及更多其他功能:

Django自动执行许多操作。Flask的哲学略有不同-显式优于隐式。如果应该初始化某些内容,则应由开发人员初始化。

Flask-Admin遵循此约定。作为开发人员,您有责任告诉Flask-Admin应该显示什么以及如何显示。有时这需要编写一些样板代码,但将来会有所回报,尤其是在您必须实现一些自定义逻辑的情况下。

Flask-Admin支持许多数据库后端,例如SQLAlchemy,Peewee,MongoEngine等。您也可以添加自己的后端。它也可以与(或不与)流行的Flask auth扩展一起使用,如Flask-Login, Flask-Principle和Flask-Security。

路由和视图

这两个框架都允许您将URL映射到视图,并支持函数和基于类的视图。

Django

当请求与URL模式匹配时,将保存HTTP请求信息的请求对象(request)传递给视图,然后调用该视图。每当需要访问请求对象时,都必须在函数中显式传递它。Django URL和视图分别在urls.py和views.py单独的文件中定义。

Flask

Flask的核心是使用Werkzeug,它提供了URL路由和请求/响应处理。在Flask中,请求对象request是全局的,因此您可以更轻松地访问它(只要导入即可)。URL路由通常通过装饰器与视图一起定义,但是你也可以将其分离到类似于Django模式的集中位置。

您是否注意到Django和Flask两者都处理请求对象的不同之处?通常,Flask在事物方面趋于更加明确,但在这种情况下,情况恰恰相反:Django强制您显式传递请求对象,而Flask的请求对象可以神奇地使用。这是Flask的困难部分之一,特别是对于那些来自类似Express.js的样式框架的新框架。

表单

表单是大多数Web应用程序的另一个重要组成部分,作为默认组件已经包含在Django里了。这包括输入处理以及客户端和服务器端验证,以及各种安全问题的处理,例如跨站点请求伪造(CSRF),跨站点脚本(XSS)和SQL注入。你可以从数据模型(通过ModelForms)创建它们,并与管理后台admin很好地集成。

Flask默认情况下不支持表单,但是功能强大的Flask-WTF扩展将Flask与WTForms集成在一起。WTForms-Alchemy可用于基于SQLAlchemy模型自动创建表单,弥合了表单和ORM之间的空白,就像Django的ModelForm一样。

 

可重复使用的组件

关于项目结构,随着您的应用程序变得越来越复杂,这两个框架都可以通过将具有相似功能的相关文件分组在一起,使您轻松拆分它们。因此,例如,您可以将所有与用户相关的功能分组在一起,其中可以包括路由,视图,表单,模板和静态文件。

Django有一个应用程序(app)的概念,而Flask有一个蓝图 (blueprints)。

Django应用比Flask蓝图更复杂,但是一旦安装,它们往往更易于使用和重复使用。另外,由于urls.py, models.py和views.py约定一致的项目结构!-您可以相当轻松地将新开发人员添加到Django项目中。同时,蓝图更容易安装和运行。

模板和静态文件

模板引擎使您可以将信息从后端动态地注入到页面中。Flask默认使用Jinja2,而Django有其自己的模板引擎。它们在语法和功能方面相当相似。您也可以将Jinja2与Django一起使用。

这两个框架也都支持静态文件处理。Django附带了一个方便的管理命令python manage.py collectstatic,用于收集所有静态文件, 把他们放在一个集中位置用于生产环境部署。

异步视图

Flask不支持异步请求处理程序。

随着Django 3.1的引入,Django支持异步处理程序。使用关键字可以使视图异步async。异步支持也可用于中间件。如果需要在异步视图中进行同步调用,则可以使用sync_to_async函数/装饰器。这可以用于与Django尚不支持异步的其他部分进行交互,例如ORM和缓存层。

异步Web服务器,包括但不限于,Daphne,Hypercorn,Uvicorn应该被用来发挥异步视图的优势。

有关Django中异步视图的更多信息,请查看Django 3.1中的异步视图。

测试

这两个框架都内置了对测试的支持。

对于单元测试,它们都利用Python的unittest框架。它们每个都还支持一个测试客户端,您可以向该客户端发送请求,然后检查和验证响应的某些部分。

在扩展方面,如果您喜欢unittest框架的工作方式,请查看Flask-Testing。另一方面,Pytest-Flask扩展为Flask添加了Pytest支持。对于Django,请查看Pytest-Django。

其它功能

Django还附带其他一些功能,但Flask没有:

安全

如前所述,Django具有针对多种常见攻击媒介(如CSRF,XSS和SQL注入)的内置保护。另一方面,Flask的代码库要小得多,因此需要攻击的表面积较小。

归根结底,您的安全性只有最薄弱的一环。由于Flask更加依赖第三方扩展,因此应用程序的安全性经常取决最不安全的第三方扩展。你需要及时地评估和监视第三方库和扩展的安全性,这会给您的开发团队带来更大的压力,以维护应用安全性。由于每个扩展都有自己的开发团队,文档和发布周期,因此使它们保持最新是最重要(也是最难的)事情。在某些情况下,可能只有一个或两个开发人员维护特定的扩展。在评估一个扩展对另一个扩展的评估时,请务必查看GitHub问题,以了解维护人员通常需要多长时间来响应关键问题。

这并不意味着Django本质上比Flask更安全。在应用程序的整个生命周期中,Django可以更轻松稳定地维护应用程序的安全性。

灵活性

从设计上来说,Flask比Django灵活得多,并且可以扩展。因此你可以需要根据业务需求(例如ORM,权限,身份验证等)添加适当的扩展,因此Flask的设置和第三方扩展的选择通常会花费更长的时间。对于不符合标准Django模型的应用程序,这种前期成本会带来更大的灵活性。

不过要小心。灵活性为开发人员提供了更多的自由和控制权,但这会减慢开发速度,尤其是对于大型团队而言,因为需要做出更多的决策。

开发人员喜欢自由地做他们想解决问题的任何事情。由于Flask并未对应用程序的开发方式和项目布局提供很多限制或意见,因此开发人员可以自行设计自己的应用程序。结果是,两个并排比较可互换的Flask应用程序的结构将有所不同。因此,您需要一个更成熟的团队来了解设计模式,可伸缩性以及测试处理这种灵活性的重要性。

教育

学习模式,而不是语言或框架

无论您的最终目标是学习Flask还是Django,建议从Flask开始。这是学习Web开发基础知识和最佳实践以及几乎所有框架都通用的Web框架核心部分的绝佳工具。

  1. Flask比Django更轻巧,更明确。因此,如果您是Web开发的新手,而不是Python的新手,您会发现使用Flask进行开发要容易得多,因为感觉就像您正在使用Vanilla Python来定义请求处理程序和视图一样。

  2. Django有很多开销。从项目结构到设置,再到安装许多您不了解的细节,您将迷失方向,最终花了很多时间了解Django本身,而没有学到实际的基础知识。

在几乎所有情况下,学习Django前建议先学Flask。唯一例外的就是你需要快速快速开发一个应用程序来满足某些外部利益相关者的需求。如果已学Django,只要确保在某个时候回到Flask来学习些基础知识即可。

开源社区

Django和Flask都具有强大的开源社区。

截至2020年10月26日的GitHub统计信息:

*依赖关系被其他存储库使用的次数

截至2020年10月26日的Stackoverflow上问题:

我们在这里可以得出什么结论?

  1. 两个社区都很活跃

  2. Django比较老,贡献者更多

  3. Flask被更多的项目使用

  4. 网络上有更多的关于Django的内容

要从开源角度真正比较这些框架(或生态系统),您必须考虑Jinja2和Werkzeug以及一些核心Flask库和扩展,例如SQLAlchemy / Flask-SQLAlchemy,Alembic / Flask-Alembic和WTForms / Flask-WTF。

由于Flask的核心功能分散在多个项目中,因此社区很难在各个项目之间创建和开发必要的协同作用以维持发展势头。例如,Flask没有用于创建RESTful API的单个事实上的扩展。截至2020年10月26日,(可能有)四个流行的扩展:

此外,为了找到这些扩展,您需要具备一些相当扎实的信息检索技能。您必须过滤掉所有未维护的扩展以及引用它们的博客文章。实际上,针对RESTful API的扩展项目很多,以至于只发布自己的代码并对其进行开源通常会更容易。到那时,您可能会对其进行一些维护,但最终它将成为问题的一部分,而不是解决方案。

笔记:

  1. 这并不是对Flask社区的打击。从整体上看,这是一个问题,特别是在微型Web框架中,您经常不得不将由不同开发人员维护的,在不同发行周期,具有不同文档质量级别的多个项目整合在一起。如果您想极端欣赏它,请前往JavaScript社区。

  2. Django社区绝对不能幸免。这几乎没有什么问题,因为它几乎可以处理现成的构建和保护标准Web应用程序所需的一切。

招聘

尽管Python和Django都受欢迎,但很难雇用Django开发人员。由于它们的需求量很大,因此很难招到和保留他们,而且很多是高级开发人员,因此价格可能非常昂贵。也没有很多新的,有抱负的Web开发人员学习Django,因为该行业把更多的精力放在较小的框架上了,而且框架本身也很难学习。

Flask开发人员可能也很难招聘,但是它比Django更容易,因为它是一个轻量级的框架,具有较少的抽象层。一个有能力以不同语言(例如Express.js或Sinatra)使用类似框架的经验丰富的开发人员,可以相当快地熟悉Flask应用程序。雇用此类开发人员时,您的搜索重点应放在了解设计模式和基本软件原理的人员,而不是他们所知道的语言或框架上。

如何选择?

在确定框架时,请务必考虑到项目的个人需求。由于Django提供了很多优点,因此您应该利用它们。如果您对Django如何处理某些事情有强烈的异议,则可以使用Flask。如果您不会利用Django提供的结构和工具,也可以选择Flask。

让我们看一些例子。

数据库

如果您的应用程序使用SQLite,PostgreSQL,MySQL或Oracle,则应该仔细考虑一下Django。另一方面,如果您使用的是NoSQL或根本没有数据库,那么Flask是一个不错的选择。

项目规模和预期寿命

Flask适用于范围界定明确且预期寿命较短的较小,较不复杂的项目。

由于Django会强制采用一致的应用程序结构,而无论项目的大小如何,几乎所有Django项目都具有类似的结构。因此,Django可以更好地处理较大的项目(具有较大的团队),这些项目具有更长的生命周期并具有很大的增长潜力,因为您很可能会不时地加入新开发人员。

 

应用类型

您正在构建哪种应用程序?

Django擅长使用服务器端模板创建功能全面的Web应用程序。如果您只是在开发纯静态网站或提供REST API服务,那么Flask是一个不错的选择。如果将Django与Django REST Framework结合使用,在后一种情况下也能很好地工作。

Django REST框架(DRF)是最流行的第三方Django软件包之一,该框架用于通过RESTful接口公开Django模型。它附带了您所需的一切(视图,序列化器,验证,身份验证)以及更多内容(可浏览的API,版本控制,缓存),可快速轻松地构建API。再次说,请记住,像Django ORM一样,它旨在与关系数据库结合使用。

Flask也具有许多出色的扩展:

另外一定要考虑一下Connexion,它将视图,序列化和身份验证功能组合到一个软件包中!

结论

那么您应该使用哪个框架呢?与往常一样,这需要具体情况具体分析。选择使用一种框架,语言或工具而不使用另一种框架,语言或工具几乎完全取决于当前的上下文和问题。

Django功能齐全,因此您或您的团队需要做出的决策更少。您可能可以以这种方式更快地行动。但是如果您不同意Django为您做出的选择之一,或者您有独特的应用程序要求限制了可以利用的功能数量,那么您可能希望使用Flask。

总是会有折衷和妥协的地方。考虑项目约束,例如时间,知识和预算。您的应用程序有哪些主要功能?您不能妥协的是什么?您需要快速行动吗?您的应用程序需要很大的灵活性吗?在回答这些问题时,请尽量将您的偏见搁置一旁。

最后,这两个框架都降低了构建Web应用程序的入门门槛,使它们的开发更加轻松快捷。

- 完 -

鸣谢

原作:Michael Herman, RealPython创始人

原文链接:https://testdriven.io/blog/django-vs-flask/

推荐阅读

为什么学Django及Django的未来在哪里?

好消息 !

大江狗的Django入门教程和RESTFramework教程已根据Django 3.x做更新,并已经搬到个人博客(https://pythondjango.cn/)上了,点击原文即可阅读哦,每一篇文章都是值得你收藏!


标签:

素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。