Flask 和 Django 的比较

2016-04-23 09:59:40 +08:00
 gevin

最近在写一篇博客,里面对 Flask 和 Django 做了一些对比,这部分内容列出来和大家讨论一下,不合适的地方欢迎大家指正

( 1 ) Flask

( 2 ) Django

25013 次点击
所在节点    Python
33 条回复
ming2281
2016-04-23 10:14:45 +08:00
都是非常喜爱的 Python-Web 框架, 各有优缺点
都很强大

内心更加偏爱 Flask 一点
:)
fy
2016-04-23 10:25:26 +08:00
如果是这两个我更喜欢 flask ,如果有更多那么我选 tornado
wph95
2016-04-23 10:57:50 +08:00
个人开发用 Flask
团队开发用 Django


> 各方面性能均等于或优于 Django
在我的印象里,看到过多篇性能分析的文章,都是说 django 优于 flask 的 (反正都是 python ,有毛性能可言)
2225377fjs
2016-04-23 10:58:38 +08:00
感觉 Python 的 web 框架真是太多啊,个人大多数只是是拿来做一些 HTTP 的服务,感觉 gevent 加上 tornado 就能解决大多数需求了,性能和扩展性都不错, mongo 和 redis 用起来爽的不要不要的。现在说 Flask 好的人很多,也有很多人说 Bottle 很好,各种各样的,都凌乱了。
yubang
2016-04-23 11:10:34 +08:00
还是觉得 flask 好用, django 总感觉太重了。不过前后端彻底分离之后, flask 也不想用了,默认带着 jinja2 又用不上看着就纠结。还是用 bottle 接收参数,输出个 json 比较爽。并且 bottle 只有一个文件,自己改造起来也方便。
Owenjia
2016-04-23 12:37:06 +08:00
@yubang
可以试试 pycnic 啊
tabris17
2016-04-23 12:40:22 +08:00
django 团队开发,然后 urls.py 文件三天两头地冲突
zhuangzhuang1988
2016-04-23 12:43:04 +08:00
@tabris17 但是有统一的路由看还是很好的
virusdefender
2016-04-23 12:57:09 +08:00
django 最喜欢的是 ORM ,其他都差不多。
yepinf
2016-04-23 12:58:38 +08:00
模板还是喜欢 mako , flask, django,tornado...都可以使用
SlipStupig
2016-04-23 15:39:36 +08:00
tornado+gevent 解决绝大部分问题
SlipStupig
2016-04-23 15:40:42 +08:00
但是 pythonweb 框架能不能自动管理路由,算优点也算缺点吧
gevin
2016-04-23 16:23:55 +08:00
@wph95 我记得 Flask 相比于 Django ,对 request 的相应速度、数据的序列化反序列化等方面,都要快好多,但基于 Python 的 web 框架,整体性能上还是比其他语言的框架差不少
wph95
2016-04-23 16:43:40 +08:00
@gevin
json 解析是有点问题 我记得 django1.9 说到并解决了一些
request 你可以 google django flask 两者差 3%以内。
你看国外 instagram disqus mozilla 都是 Django ,基本叫不出哪个公司有用 Flask 的。这不是偶然。
fy
2016-04-23 16:44:18 +08:00
@SlipStupig 可以的,你写一个简单的 hack 就能用装饰器方式来路由了,不超过 50 行
only0jac
2016-04-23 17:19:10 +08:00
“而其与 NoSQL 数据库的配合远远优于 Django ”

这个怎么讲?
gevin
2016-04-23 17:33:57 +08:00
@only0jac Django 自带 ORM 与关系型数据库绑在一起了,配合 NoSQL 数据库相当于要废掉 Django 的 Model ,很多与 Model 绑定的业务逻辑也就废了(如 ModelForm ),所以如果没有特殊原因,为什么要使用 Django+NoSQL 的搭配?
only0jac
2016-04-23 18:24:55 +08:00
@gevin Thanks Very Much.
alexapollo
2016-04-23 18:30:09 +08:00
似乎这篇参考了 SO 上的回答?
neoblackcap
2016-04-23 18:48:08 +08:00
其他的我就不发表观点了,我只想说『 Django 的自带 ORM 非常优秀,综合评价略强与 SQLAlchemy 』这样的评价没有能说明任何问题,以下是我的见解

在 Python 以及关系型数据库 ORM 中对应的 Django 跟 SQLAlchemy 可谓两个很典型例子。 Django 很明显是从 RoR 里面得到启发,因此很多时候它也很像 RoR ,比如 Django 就是典型的 Active Record,数据库里面的行直接映射成 Model 的实例,并且所有对数据库的操作是直接与实例绑定,例子即为:
New.objects.create(title='sport', author_name='Neo')
对象(实例)不单单封装了数据库表里面的一行(数据)还封装了数据库的操作,以及在这些数据上面有领域逻辑,比如:
User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
Active Record 对象不仅仅有访问数据的一些方法,而且还有领域逻辑(我们实际的业务逻辑),而且领域模型中的数据跟数据库基本吻合

而 SQLAlchemy 的领域模型就不一样, SQLAlchemy 是基于 Data Mapper 设计而成的。 SQLAlchemy 的数据操作是不能直接作用与实例,它是通过一个 proxy(Data Mapper)来维护领域模型(大致上对应 SQLAlchemy 里面我们定义的 Model )跟数据库表的映射关系,它最大的优点便是数据库表跟领域模型是两个独立的概念,他们之间的关系是解耦的,因此他们可以独立演变,这之后需要做的只不过是我们去更新 Data Mapper 。因此 SQLAlchemy 给我的最大印象就是,它可以实现多态,比如一个 Animal 类可以对应数据库里面的 Dog 跟 Cat 表,以至于一个 Animal 的 cry 方法可以返回"woof"或者"meow"

同时 SQLAlchemy 还有 core 模块去提供高效率的查询(效率可以达到 raw sql 的水平)同时它的查询方式跟 Django 比起来更多样,比如 SQLAlchemy 的 ORM 模块能提供跟以下 SQL 语句对应的查询方式(仅通过一个查询):
select username, score from users join classmates on users.user_id=classmates.user_id where classmates.age > 20 group by (users.username, MAX(users.score));

我个人是觉得 SQLAlchemy 从功能以及灵活性来说都是源于强于其他 ORM ( python 以及对应关系型数据)。但是它跟 Django 比起来就是它有一个很陡峭的学习曲线,这是它的最大缺点。因此我是建议简单项目或者与 Django 相关的使用 Django ORM ,其他的话,若是你们团队协作,而且会有领域模型跟数据库表演进速度不一致的情况,那么选用 SQLAlchemy 是一个不错的选择。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/273819

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX