V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
gevin
V2EX  ›  Python

Flask 和 Django 的比较

  •  
  •   gevin ·
    flyhigher139 · 2016-04-23 09:59:40 +08:00 · 25258 次点击
    这是一个创建于 3166 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    ( 1 ) Flask

    • Flask 确实很“轻”,不愧是 Micro Framework ,从 Django 转向 Flask 的开发者一定会如此感慨,除非二者均为深入使用过
    • Flask 自由、灵活,可扩展性强,第三方库的选择面广,开发时可以结合自己最喜欢用的轮子,也能结合最流行最强大的 Python 库
    • 入门简单,即便没有多少 web 开发经验,也能很快做出网站
    • 非常适用于小型网站
    • 非常适用于开发 web 服务的 API
    • 开发大型网站无压力,但代码架构需要自己设计,开发成本取决于开发者的能力和经验
    • 各方面性能均等于或优于 Django
    • Django 自带的或第三方的好评如潮的功能, Flask 上总会找到与之类似第三方库
    • Flask 灵活开发, Python 高手基本都会喜欢 Flask ,但对 Django 却可能褒贬不一
    • Flask 与关系型数据库的配合使用不弱于 Django ,而其与 NoSQL 数据库的配合远远优于 Django
    • Flask 比 Django 更加 Pythonic ,与 Python 的 philosophy 更加吻合

    ( 2 ) Django

    • Django 太重了,除了 web 框架,自带 ORM 和模板引擎,灵活和自由度不够高
    • Django 能开发小应用,但总会有“杀鸡焉用牛刀”的感觉
    • Django 的自带 ORM 非常优秀,综合评价略强与 SQLAlchemy
    • Django 自带的模板引擎简单好用,但其强大程度和综合评价略低于 Jinja
    • Django 自带 ORM 也使 Django 与关系型数据库耦合度过高,如果想使用 MongoDB 等 NoSQL 数据,需要选取合适的第三方库,且总感觉 Django+SQL 才是天生一对的搭配, Django+NoSQL 砍掉了 Django 的半壁江山
    • Django 目前支持 Jinja 等非官方模板引擎
    • Django 自带的数据库管理 app 好评如潮
    • Django 非常适合企业级网站的开发:快速、靠谱、稳定
    • Django 成熟、稳定、完善,但相比于 Flask , Django 的整体生态相对封闭
    • Django 是 Python web 框架的先驱,用户多,第三方库最丰富,最好的 Python 库,如果不能直接用到 Django 中,也一定能找到与之对应的移植
    • Django 上手也比较容易,开发文档详细、完善,相关资料丰富
    第 1 条附言  ·  2016-04-23 16:44:12 +08:00

    折腾了几天,我那篇博客也写完了,链接地址:

    Flask 入门指南

    欢迎大家与我交流~

    33 条回复    2018-03-12 11:04:48 +08:00
    ming2281
        1
    ming2281  
       2016-04-23 10:14:45 +08:00
    都是非常喜爱的 Python-Web 框架, 各有优缺点
    都很强大

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


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

    这个怎么讲?
    gevin
        17
    gevin  
    OP
       2016-04-23 17:33:57 +08:00
    @only0jac Django 自带 ORM 与关系型数据库绑在一起了,配合 NoSQL 数据库相当于要废掉 Django 的 Model ,很多与 Model 绑定的业务逻辑也就废了(如 ModelForm ),所以如果没有特殊原因,为什么要使用 Django+NoSQL 的搭配?
    only0jac
        18
    only0jac  
       2016-04-23 18:24:55 +08:00
    @gevin Thanks Very Much.
    alexapollo
        19
    alexapollo  
       2016-04-23 18:30:09 +08:00
    似乎这篇参考了 SO 上的回答?
    neoblackcap
        20
    neoblackcap  
       2016-04-23 18:48:08 +08:00   ❤️ 1
    其他的我就不发表观点了,我只想说『 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', '[email protected]', '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 是一个不错的选择。
    gevin
        21
    gevin  
    OP
       2016-04-23 19:30:33 +08:00
    @alexapollo 完全是我个人观点, Stack Overflow 上有类似的观点?能否发个链接看看
    yubang
        22
    yubang  
       2016-04-23 19:43:28 +08:00
    @Owenjia 看了一下, pycnic 的确够简洁的
    gevin
        23
    gevin  
    OP
       2016-04-23 19:44:55 +08:00
    @neoblackcap 你说的没错, SQLAlchemy 比 Django 自带的 ORM 要强大。综合评价一个应用时,除了本身强大的功能外,还考虑了易用性,学习成本等, SQLAlchemy 和 Django 的 ORM 都很优秀,但综合评价时,更多会偏向从开发者的平均水平甚至初学者水平,而不是高手的水平, SQLAlchemy 减分项要稍微多一点。

    当然,这也只是我的个人观点
    neoblackcap
        24
    neoblackcap  
       2016-04-23 20:05:40 +08:00
    @gevin 所以你要说明白,你一句 Django ORM 综合起来比 SQLAlchemy 强,新手还以为是 Django ORM 特性多,性能高。
    很多时候就是这样,高灵活性以及低抽象成本必然伴随高的学习成本。
    你分享你的具体看法观点,我们都来切磋切磋,这样你我才能进步嘛,仅抛一个结论就出来跟『 vim 大法好』这样有什么区别:-)
    gevin
        25
    gevin  
    OP
       2016-04-23 20:15:16 +08:00
    @neoblackcap 我是说`综合评价`,只是评价,评价最好的不代表是最强的。`综合评价略强`改成`综合评价略高`会不会好一点,貌似`强`这个字引发了歧义。你对这二者是何观点?
    neoblackcap
        26
    neoblackcap  
       2016-04-23 20:29:13 +08:00
    @gevin 没有观点,选合适的, C++性能高但初学者用会很容易崩掉自己的腿。道理就是这样。我只是觉得仅仅一个结论不能达到你想要分享的初衷。
    因为这样一个结论很多时候只能带来,『对啊, Django ORM 就是强』,『开玩笑, SQLAlchemy 才是最好的』,『 Pony ORM 才好,其他都是垃圾』这样无意义的回应。
    记得一次与一位大牛聊天,他说编程中我们现在已经有很多资源了,但是好软件,好产品一样很少,这个原因就是人们缺少对事物的了解,以至于无法将资源合理利用。
    所以我认为,我们在网上发表我们的观点时候是不是可以尽量地将我们的思考方式展现给大家呢?你是如何得出这个结论,我认为这才是关键,这才是大家想看到的『渔』之道。这样的文章无论是初学者还是中级谋求突破的开发者都会喜欢看到。
    若是题主你能做到此步,我相信你的文章就会更精彩
    tairan2006
        27
    tairan2006  
       2016-04-24 08:48:22 +08:00 via Android
    我们团队虽然用 Django ,但是基本用 sqlalchemy …自带的 ORM 没人用
    geek123
        28
    geek123  
       2016-04-24 11:20:24 +08:00
    写过这两个框架的一些分享内容,楼主也可以提提意见。
    http://www.hubwiz.com/course/?type=Python

    多谢!!!
    broven
        29
    broven  
       2016-04-24 13:03:43 +08:00
    是来黑 django 的么, 圣战.
    zhouquanbest
        30
    zhouquanbest  
       2016-04-24 18:29:41 +08:00
    所以我选 Tornado
    jeff_kit
        31
    jeff_kit  
       2016-04-27 10:41:31 +08:00
    那谁说 Django ORM 是模仿 ROR ,谁先出生的还不清楚吧。

    既然说开了,就继续说一说,脱离了使用场景来选 web 框架都是耍流氓。你只是写个 Hello world ,干嘛要用 Django 啊?你需要一个管理后台,用 Flask 搞半年搞不好。

    反正我做 web 项目一定会优先考虑自己熟悉的 Django ,生态强大,基础设施完备,马上就能开撸业务逻辑。记得两三年前某大牛朋友看不惯 Django 大而全,亲自带队选了 Flask 来做公司的基础 web 框架,半年后跑来跑我说,妈蛋,我们这半年吭哧吭哧搞出来的东西(用户体系,权限管理系统,管理界面等), Django 里面早就集成好的了,浪费了太多的时间。你们感受下。
    zlandjj
        32
    zlandjj  
       2016-04-28 10:11:49 +08:00
    前两天做了几个小功能, django 很多中间件配一下就好了。 生态强大啊 。
    geek123
        33
    geek123  
       2018-03-12 11:04:48 +08:00
    我还是更推荐先使用 flask 更好些,对技术能力的增长更有好处,django 封装的太厉害了。flask 的入门教程给大家推荐一下:
    [http://xc.hubwiz.com/course/562427361bc20c980538e26f]( http://xc.hubwiz.com/course/562427361bc20c980538e26f?affid=v2ex20180312)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2715 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 00:26 · PVG 08:26 · LAX 16:26 · JFK 19:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.