Python 有哪些好的 Web 框架?

pylons 如何?
关注者
2,327
被浏览
899,123

57 个回答

对初学者来说,循序渐进是最重要的,我推荐学习 Flask(

Welcome | Flask (A Python Microframework)

Flask 很轻,花很少的成本就能够开发一个简单的网站。非常适合初学者学习。

Flask 框架学会以后,可以考虑学习插件的使用。例如使用 WTForm + Flask-WTForm 来验证表单数据,用 SQLAlchemy + Flask-SQLAlchemy 来对你的数据库进行控制。

BTW:果壳网基于 Flask 开发的。

另外也简单介绍下其他框架:

1. Django。如楼上所说,是一个全能型框架。目前 Django 的使用面还是很广的,有学习的价值,但是不建议初学者学习,因为要学习的东西太多了,一下子难以吸收会失去兴趣。当然,Django 的目的是为了让开发者能够 快速 地开发一个网站,它提供了很多模块,其中我最喜欢的就是 admin 模块,

your.site.com/admin

就进入了网站的后台(内置的哦~)方便地对数据进行操作,等等。。。。因此,如果对 Django 熟悉的话,papapa 一下子就写好一个网站的原型了。

2. Tornado。传说中性能高高的框架。Tornado 是一个很好的框架,支持异步处理的功能,这是它的特点,其他框架不支持。另外一点是,Tornado 的设计似乎更注重 RESTful URL。但 Tornado 提供了网站基本需要使用的模块外,剩下的则需要开发者自己进行扩展。例如数据库操作,虽然内置了一个 database 的模块(后来独立出去了,现在叫做 torndb,

bdarnell/torndb · GitHub

)但是不支持 ORM,快速开发起来还是挺吃力的。如果需要 ORM 支持的话,还需要自己写一层将 SQLAlchemy 和 Tornado 联系起来,而且这里还有一个坑。

BTW:知乎就是基础 Tornado 开发的。

3. Bottle。Bottle 和 Flask 都属于轻量级的 Web 框架。但是 Bottle 似乎落寞了。我觉得跟他的 API 设计有关系。个人认为 Bottle 使用起来不那么顺手,因此也用得少。这里不做太多介绍。

4. web.py。也是很轻的一个框架,使用不多,也不做介绍。

5. web2py。我看楼上都没有对这个框架做介绍。这个框架是 Google 在 web.py 基础上二次开发而来的,兼容 GAE 。性能据说很高,曾经用他来做自己的主页,感觉也还不错。缺点同样是对扩展支持不太好,需要自己进行扩展。

6. Quixote。著名的 豆瓣 就是基于 Quixote 开发的。跟上面几个框架不同,Quixote 的路由会有些特别。另外 Quixote 的性能据说也好。

只推荐 Flask/Django 顺便 从整体设计,路由设计,应用模块化设计,配置等方面比较一下这两个框架

2019 年 4 月 23 日,我来更新一下

请允许我慢慢道来。目录如下

    一、整体设计 : section
    二、路由设计 : section
    三、应用模块化 : section
    四、配置 : section
    五、文档 : section
    六、社区 : section
  ▼ 七、对 Django 的误解 : section
      误解 1. Django 应用比 Flask 应用重 : section
      误解 2. Flask 代码比 Django 代码优雅 : section
      误解 3. Django 不容易扩展 : section
    八、对新手的建议 : section


直观感受是:

  1. Flask 讲究的是 less is more
  2. Django 讲究的是 more is less

一、整体设计

Flask 怎么定位自己的?

将自己定位为微框架。啥叫微框架,就是毛坯房的意思。给你个毛胚房,你自己装修去。

Django 怎么定位标榜自己的?

划重点 The web framework for perfectionists with deadlines. 完美主义者的 Deadline 终结框架

定位不同,就会导致设计上和功能上的倾向性。

假如你和我一样是先用 Django 这种给你准备了大量方便工具的框架。当你切换到 Flask 的时候,明显会感觉到的问题是:

不但失去了铠甲,还多了很多根软肋。
  1. 表单怎么解决? Django Form 很好用呀。
  2. 跨站攻击? Django 帮你做了 csrftoken
  3. 登陆认证鉴权怎么搞定? Django 自带了 backend 和 auth 模块。
  4. ORM 怎么挑选?Django ORM 很好用。
  5. DBMigration 怎么做? Django Migration 了解一些?
  6. 缓存怎么做? Django Cache 了解一下?
  7. 其他...

Flask 只是一个微框架。要做你自己组装去。

  1. 表单怎么解决? 从社区找了个 Flask-Form?
  2. 跨站攻击? 社区 Flask-Form 帮你做了。
  3. 登陆认证鉴权怎么搞定? 自己写 User 模块。
  4. ORM 怎么挑选?flask-sqlalchemy 自己组装一下。等等 SQLAlchemy 是什么玩意? query 语法写起来怎么这么原始...
  5. DBMigration 怎么做? Alembic 配合 SQLAlchemy, 等等,SQLAlchemy?? Alembic
  6. 缓存怎么做? 自己手动封装一下 RedisPy
  7. 其他...

当然,我并不是在否定 Flask, 功能少某种程度上不是框架的缺点,而是使用者的缺点。笑....

  • 如果你说 Flask 是轻量级的,是方便扩展的,那是你是对的。
  • 如果你说 Flask 应用是轻量级的,那我可能就要强行杠你一波了。 Flask-Form / Flask-AUTH / SQLAlchemy / Alembic / werkzeug ....

如果你是进阶的玩家,你可能更喜欢 DIY 一些

二、路由设计

路由设计上,从使用者的角度来说,更喜欢 Flask 一些,因为可以随用随定义。

from flask import Flask

app = Flask(__name__)

@app.route('/') # 不使用蓝图
def hello():
    return 'Hello, World!'

bp = CustomBlueprint("user", __name__, url_prefix="/user")
@bp.get('/')    # 使用自定义的蓝图
def hello_bp()
    return 'Hello bp'

Flask 可以依据蓝图注册不同 errorhandler/beforerequest 等钩子 这确实超级方便

Django 就没那么灵活了。但通过 middleware 也能做

代码组织的好的话,两者差距不是很大。

三、应用模块化

假设我设计一个应用叫做 shamate, 这个应用可能要对接多方面接口:

  1. 企业端
  2. 用户端
  3. Admin 端

使用 flask 的时候,一个这样的应用,文件结构应该是这样的。

shamate
	apps # 通过 blueprint 切分模块
		company
			views.py
		user
			views.py
		admin
			views.py
	models
	service
	tasks.py
	__init__.py
	app.py
	db.py
	helpers.py
	settings.py
	worker.py

嗯,被老大 Flask 大牛带了一段时间之后,切分 django 是这么切分的

em..... 非常的 flasky
shamate
	core
		auth.py
		db.py
		tasks.py
		models.py
	company # 通过 django app 切分模块
		view.py
		urls.py
	user
	store
	__init__.py
	celery.py
	logging.py
	m.py
	settings.py
	urls.py
	wsgi.py

需要注意的是,Django 的在 Models 里面设置的时候务必显式写上 table 名

class Order(Model):
	# your fields
    class Meta:
        db_table = "order"

Django 模块如果涉及到业务的 Model, 一般很难通用,但如果要写通用的 Tag 系统 Attachment 系统,则,一般性能可能不太跟得上。如果不在意性能的话,建议 Folk 一份开源库,方便后期修改。

四、配置

参考上面的结构,你应该能看出来,配置其实相差不是很大。主要区分 local/stage/test/prod 环境即可。

五、文档

Django 是看了文档就能撸一个不错的项目出来。在不断学习的过程中,参考社区最佳实践。慢慢的撸一套自己的标准。

Flask 则是...... 需要更多的参考社区最佳实践。

六、社区

扩展都挺多的。但建议涉及到业务逻辑的扩展,直接 cv 到项目中。这样方便后期定制。

Django 社区里面东西满多的, 举个例子, 我的文章里介绍过

在使用 Django 项目的时候,我必须要安装的第三方库就是 djangodebugtools

这个工具用起来有多舒服呢?

可以直接 Profile SQL 语句

甚至可以直接 explain sql 以及 查看缓存情况

这方面的话, 推荐两本书, 他们推荐的第三方库都是不错的.

  • 《Django 企业开发》这本书是国人写的, 特别推荐一下 @胡阳
  • 《Two Scoops of Django》

至于 Flask 则推荐官方的链接

包含了社区质量相对高的包.

比如 Form的处理/Admin的处理/ORM/Alembic/RateLimit/Redis等等.

七、对 Django 的误解

误解 1. Django 应用比 Flask 应用重

实际上不然,我接触的 Flask 项目都写成了自己的一套标准。

  1. 表单怎么解决?自己搞一套 Form 标准
  2. 登陆认证鉴权怎么搞定? 自己写 User 模块。
  3. ORM 怎么挑选?定制 flask-sqlalchemy
  4. DBMigration 怎么做? Alembic 配合 SQLAlchemy,
  5. 缓存怎么做? 自己手动封装
  6. 其他...

最后你发现你学的东西一点都没比 Django 少到哪里去。

误解 2. Flask 代码比 Django 代码优雅

  • 对的,代码少自然优雅.....

误解 3. Django 不容易扩展

Django 没那么难扩展。

  1. 你说,我不想用 template, 我想 直接开接口 Rest 一波流。DjangoRestFramework 满 足你的要求。
  2. 你说,我的用户系统比较复杂,我不想用 Auth 模块,你直接定义 User/Company/AdminStaff 即可。
  3. 你说,admin 模块很难用,但讲真的,admin 模块适合人手不足的情况下快速怼界面,快 速验证自己的设计思路。国人出的 xadmin 也是不错的。
  4. Django 不 Scale, 缓存做好了么?查询优化了么?分库分表了么?MQ 做了么?如果这还不够的话,确实应该开开心心的招人换语言和框架了。
  5. Django 很重.... 然而,你学完一套 Flask 的整个体系之后,发现一点都没比 Django 少学什么。但一定会发现你在找文档上面确实花费了不少的时间。

八、对新手的建议

都学,先 Django, 后 Flask

理由是,通过 Django 可以以最小成本的了解 Web 开发的点点滴滴,然后看工作项目是啥就认真研究啥。

之前觉得Django写起来很快的, 但被TL带了一段时间之后, 发现TL也能把flask app写的很快, 这还是取决于使用者的.

当然,如果有兴趣的话,可以通过我在专栏写的 Django 的文章来做个实战项目了解 Django 开发的点点滴滴