Django vs Flask:哪个框架更好?
我的这份指南是基于我最近几年使用这两个框架的经验。我将从问你是否需要一个框架开始,然后帮助你评估Django和Flask的各个方面。虽然本指南可以帮助你在Django和Flask之间做出选择,但这些参数可以让你评估任何框架。
我假设你有Python的基本知识,知道如何创建web应用程序。
你需要一个框架吗?
如果你正在开始开发一个web应用程序,你应该先概述你的需求,然后再缩小框架的范围。如果你正在建立一个产品网站,或一个投资组合,与联系方式查询,你可以选择一个静态网站生成器与外部形式,如JAMstack。对于一个相当简单的web应用程序,你可能根本不想使用基于python的解决方案。当你构建一个更复杂的web应用程序时,web框架是正确的选择。利用web框架的底层进程可以让你专注于应用程序的开发,而不用担心支持它的底层进程。
虽然Python是一种脚本语言,但像Django和Flask这样的web框架已经让web开发人员可以访问它。web框架的使用可以处理一些单调的任务,比如路由机制。框架负责将特定URL连接到执行背后的逻辑的管道。这可以让你专注于web应用的核心,而不是担心所有web应用的通用标准流程。
在由JetBrains进行的2018年Python开发者调查Flask(47%)和Django(45%)是两个最常用的框架。Flask是一个极简的Python web框架,它允许你在设计应用程序时具有很大的灵活性。Django是一个框架,它为web应用程序提供了很多结构,并提供了一些有用的功能。
假设您已经分析了您的需求,并且相信一个框架最适合您,现在我将继续比较这两个框架。
Django vs Flask:总体趋势
Django从2005年就已经出现了,并且已经发展成为一个流行的web框架。它是一个高级的开源框架,鼓励通过开箱即用的功能(如强大的ORM和基于gui的Admin)进行快速开发。Flask于2010年首次发布,现在已经发展成为一个微框架。Flask的开箱即用功能是web开发的基本要素:URL路由、请求处理和模板。
以下是关于这两个框架的一些指标:
注意,Flask的提交次数只有Django的15%左右,这表明Flask只包含框架的基本部分,这给了你进一步探索的机会。你还可以看到Flask在受欢迎程度上超过了Django。
谷歌趋势这也表明了开发者心态的转变。Flask在受欢迎程度上正在赶上Django。我在这两个搜索词后面都加上了“Python”前缀,因为在这部电影上映后,“Django”成为了一个热门搜索词Django锁不住的2012年底。“Flask”本身也有不同的含义。
的趋势在Stack Overflow中提出的问题仍然偏向于Django。这表明尽管Flask越来越受欢迎,但是Django的社区支持仍然很强大。
有一些突出的web应用是使用这些框架构建的。Instagram是完全用Django构建的最大的应用程序.用Django构建的其他流行网站有Disqus而且BitBucket都.云通信服务提供商为什么Twilio使用Flask作为API。尽管Pinterest的发展从Django和Tornado的大量修改版本开始,后来搬到了弗拉斯克.
Django和Flask入门
那么,使用Django和Flask开始开发有多简单呢?当你开始使用Django或Flask时,一般的方法是使用你在网站文档中找到的教程。
在瓶的快速入门指南,一个简单版本的“Hello World”应用程序在Flask描述。通过pip下载其最新版本并创建应用程序文件。如果运行服务器,应该能够查看主页。本指南的其余部分将帮助您逐步向Flask添加特性。入门教程的简单性在于Flask的最小哲学。
的入门部分Django文档中的page包含了一个七部分的教程。之后,您有一个正在运行的开发服务器第一部分,这整个体验旨在让你熟悉Django的核心组件,如ORM, Django Admin,表单和模板。完成本教程,你将了解Django的工作流程:当读取器访问一个URL时,Django将其与可用的URL模式进行匹配,并将其重定向到某个视图。视图是一个函数,它分析接收到的输入(在hello world示例中,您没有输入),对数据库(Model)进行必要的查询并返回响应。此响应由模板解析并根据需要显示。
虽然开始使用Flask似乎相对容易,但当创建一个更复杂的应用程序时,在Django上投入更多精力的好处会被观察到。这是两个框架哲学差异的直接结果:与Django的“电池包含”方法相比,Flask的简单性和灵活性。我将很快讨论这样做的后果。
Django vs Flask:项目剖析
在本节中,我将研究每个框架中的各种组件。首先,我将看看它们如何处理url、数据库和响应、其他有用的特性以及安全考虑因素。
URL路由和视图
Django和Flask默认都有URL路由和视图,只是它们的实现略有不同。Django分离了URL和逻辑处理。您可以定义URL模式(urls . py
),直接指向处理程序(views.py
).
在Flask中,URL模式通常被声明为装饰器或通过应用程序对象显式地声明。虽然这在开发方面并没有固有的缺点,但随着项目越来越大,它可能会带来挑战,除非您强加一个结构。如果您将URL添加为装饰器,那么如果您决定在开发后期更改应用程序的URL模式,则需要进行大量更改。这也许是个好主意集中式URL映射.
数据库支持
Django有一个底层数据库层和一个健壮的ORM系统。Django默认支持MySQL、Oracle、SQLite和PostgreSQL等流行数据库。如果你正在开始一个项目,你可以在你的模型中定义数据库结构,Django会自动为你创建表格。如果您想链接到一个现有的表,也可以通过自定义模型中的字段名来实现。
默认情况下,Flask不支持数据库。您需要使用像SQLAlchemy这样的第三方应用程序,它可以模拟Django ORM系统的特性。您应该注意到,如果您真的想在Django中使用SQLAlchemy是可以的,但是Django ORM已经处理了安全部分。
如果你使用的是NoSQL数据库,Flask提供的灵活性使你更容易与插件集成Flask-PyMongo.将NoSQL数据库与Django集成会产生一个列表兼容性问题,因为它限制了Django ORM的功能。
除了ORM功能,Django还为您提供了一个功能强大的管理界面,一旦启用,可以帮助您通过web界面有效地管理数据库对象。
模板
Flask使用Jinja2工具作为其模板引擎。它无缝地将静态和动态内容绑定在一起,以减少冗余。Django自己的模板引擎与Jinja2的语法相似,你可能不会注意到有什么不同。
Jinja2的文档列出两个模板引擎之间的主要区别。我不认为这两款游戏在开发速度上有任何优势。
其他功能
Django和Flask都有集成的测试平台。你可以使用Python的unittest在两个项目中创建测试客户端和模拟请求。
与Flask相比,Django还有其他一些优势。例如,Django有一个内置的缓存框架.Django为您提供了一个用户管理系统,用于处理身份验证和授权。所有这些都可以通过使用第三方插件在Flask中实现。Flask有超过700个插件可用Python包索引.
虽然作为核心框架的一部分,Django有许多有用的特性,但它也有大量的插件。虽然没有官方网站列出Django插件,djangopackages.org很好地记录了可用的Django包。截至2019年底,它列出了超过4000个Django包。
安全
Django有很多内置的安全措施。下面列出了其中一些:
- 使用Django模板可以通过转义在跨站脚本攻击中使用的特殊字符来防止这些攻击。Jinja2在默认情况下也提供了这种保护。
- 在使用Django表单时,可以启用CSRF保护。Flask中的CSRF保护可以通过手动插入一个随机字符串并在表单提交时验证它来完成。
- 默认情况下,Django使用ORM与数据库交互,这可以防止SQL注入。Django也支持自定义SQL,所以在使用这种查询时要小心。如果使用SQL Alchemy,默认情况下会清除用户输入。
- Django还为你提供点击劫持保护,防止你的网站在一个框架内加载。
Django vs Flask:总结
在本指南中,我们首先检查了你的项目是否真的需要一个web框架。
然后我们看了Django和Flask这两个流行的Python框架的历史和最近的趋势。虽然Django是一个更成熟的项目,但Flask最近却很受欢迎。
然后,我们检查了在这两种框架中启动项目的容易程度。虽然在Flask中创建Hello World应用程序相当容易,但Django的初始学习曲线确保了将来的快速开发。
接下来,我们研究了每个框架如何处理url、数据库和HTTP响应。Django内置了对许多关系数据库的支持,但是Flask的灵活性让你可以更容易地使用NoSQL数据库。
我们从一开始就研究了Django提供的一些额外特性。
我们最后评估了web应用的一些安全注意事项,以及如何在Django和Flask中启用它们。虽然Django默认提供了许多安全特性,但了解它们的限制是真正保护应用程序的好方法。
最终的想法
我们终于谈到了重要的问题!最好的框架是什么?不幸的是,这个问题没有统一的答案!
你会在你的网页应用中有很多动态内容吗?您的项目将大量使用关系数据库吗?你是否更倾向于创建带有一堆可读可用功能的应用程序?如果你对大多数问题的回答是肯定的,那么你应该继续使用Django。
你用Python写代码有很长时间了吗?您希望基于自己的结构开发应用程序吗?你打算在你的项目中使用NoSQL吗?您想要一个高度可定制并适应您需求的框架吗?如果你属于这一类,你应该选择Flask。