1.简介

在python web框架的世界里充满了选择。有Django,Flask,Pyramid,Tornado,Bottle,Diesel,Pecan,Falcon等等的来吸引开发者的注意。作为一个开发者,你想要从中选择一个框架来帮你完成项目,并且能继续做大事情。我们将关注Flask、Pyramid和Django。它们是微框架和商业级web服务的典范。

为了让你在这三个中做选择的时候能够更容易,我们会用每个框架来构建相同的应用,然后比较各自的代码,突出它们的优势和弱点。如果你想要代码,可以直接跳到 框架实战 章节或者在Github上下载代码。

Flask是一个微框架,主要面向需求简单的小应用。Pyramid和Django都是面向大的应用,但是在扩展性和灵活性上走了不同的路。Pyramid关注灵活性,让开发者选择合适的工具来开发项目。这意味着开发者可以选择数据库,URL结构,模板风格等等。Django的目标是提供web应用开发的一站式解决方案,所以相应的模块也就比较多。

Django包含了一个ORM模块,而Pyramid和Flask是让开发者来选择如何存储数据。针对非Django框架的最流行的ORM目前是SQLAlchemy,也有很多其他的选择,比如DynamoDB和MongoDB,亦或是像LevelDB和SQLite这样的简单本地持久化。Pyramid被设计可以使用任何持久层,甚至是还没做好的。

2  关于框架

Django的一站式解决的思路能让开发者不用在开发之前就在选择应用的基础设施上花费大量时间。Django有模板,表单,路由,认证,基本的数据库管理等等内建功能。与之相反,Pyramid包含路由和验证,但是模板和数据库管理需要第三方库。

用Flask和Pyramid来构建应用之前,选择组件的时候会给开发者带来更多的灵活性 ,可能有的应用场景不适合使用一个标准的ORM,或者需要与不同的工作流和模板系统交互。

Flask,这三个框架李最年轻的一个,创始与2010年年中。Pyramid框架来源于Pylons项目,在2010年末更名为Pyramid,它最早发布与2005年。Django发布于2006年,就在Pylons项目之后。Pyramid和Django是非常成熟的框架,积累了大量的插件和扩展来满足不同需要。

尽管Flask的历史较短,但它能够从以前的框架学到一些东西并且将它的目标设定在了小型项目上。它在一些仅有一两个功能的小型项目上得到了大量应用。比如httpbin这样的项目,简单但非常强大,是一个帮助debug和测试HTTP的库。

3 社区

Django的社区是最活跃的,在StackOverflow上有80000个相关问题和大量的博客和强大的用户。Flask和Pyramid的社区就没有这么大了,但是它们的社区在邮件列表和IRC里还是挺活跃的。在StackOverflow上只有5000个相关问题,Flask比Django的关注度小15倍。在Github上,它们的stars数相近,Django有11300个,Flask有10900个。

这三个框架都是处于BSD衍生的开源许可证书之下。Flask和Django的证书都是3条款BSD,而Pyramid的是RPL,是4条款BSD证书的衍生版。

4 入门引导

Django和Pyramid都有内建的引导工具。Flask没有,因为Flask的主要受众不是要构建大型MVC应用的。

4.1 Flask

Flask的Hello World应用的代码是最简单的,只用在一个Python文件里码7行代码就够了。

12345678910 # from http://flask.pocoo.org/ tutorial from flask import Flask app = Flask(__name__)  @app.route(\”/\”) # take note of this decorator syntax, it\’s a common pattern def hello():     return \”Hello World!\”  if __name__ == \”__main__\”:    app.run()

这就是为什么Flask没有引导工具:因为它根本不需要。从上面的Hello World应用的特点来看,一个没什么Python web开发经验的人就可以很快的上手开始撸代码。

对于需要把组件分离开的项目,Flask有blueprints。例如,你可以这样构建你的应用,将与用户有关的功能放在user.py里,把与销售相关的功能放在ecommerce.py里,然后在site.py里引用并添加到你的应用里。我们暂时不会体验这个功能了,它超出了我们的实例应用的需要。

4.2 Pyramid

Pyramid的引导工具叫pcreate,它是Pyramid的一部分。之前有一个Paste的工具,不过后来被Pyramid指定的工具链替代了。

1 $ pcreate s starter hello_pyramid # Just make a Pyramid project

Pyramid希望能够做比Flask更大和复杂的应用。因此,它的引导工具会创建一个更大的项目框架。它里面包含一个配置文件,一个例子模板,还有文件能打包你的应用并上传到Python Package Index(PYPI)。

123456789101112131415161718 hello_pyramid ├── CHANGES.txt ├── development.ini ├── MANIFEST.in ├── production.ini ├── hello_pyramid ├── __init__.py ├── static ├── pyramid16×16.png ├── pyramid.png ├── theme.css └── theme.min.css ├── templates └── mytemplate.pt ├── tests.py └── views.py ├── README.txt └── setup.py

跟别的框架相比,Pyramid的引导工具特别的灵活。它没有被限制在一个默认应用里;pcreate可以使用任何数量的项目模板。包括我们在上面使用starter模板创建出来的,包含SQLAlchemy和ZODB支撑的项目。在PyPi上,可以找到依赖于Google App Engine,jQuery Mobile,Jinja2 templating,modern frontend frameworks等等的模板。

4.3 Django

Django也有自己的引导工具,它是django-admin的一部分。

12 djangoadmin startproject hello_django djangoadmin startapp howdy # make an application within our project

我们已经可以看到Django和Pyramid的一些区别。Django把一个项目分成各自独立的应用,而Pyramid和Flask认为一个项目应该是一个包含一些视图和模型的单个应用。也可以在Flask和Pyramid里复制出像Django那样的项目结构,但那不是默认的。

123456789101112131415 hello_django ├── hello_django ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py ├── howdy ├── admin.py ├── __init__.py ├── migrations └── __init__.py ├── models.py ├── tests.py └── views.py └── manage.py

默认情况下,Django只包含空的模型和模板文件,一个新的用户可以看一点例子代码就开始工作。它也能让开发者选择如何分配Django的应用。

这个引导工具的弱点是没有引导用户去打包他们的应用,新手往往会忽视这一点。如果一个开发者从未打包过应用,他们会发现在第一次部署的时候会有点乱糟糟的。一些有较大社区的项目,如django-oscar是被打包好的,并且能在PyPi上下载,但是在Github上,一些小的项目往往缺乏统一的打包。

5 模板

有一个能回复HTTP请求的Python应用是个很好的开始,但是你的用户不会用curl来与你的应用交互。幸运的是,这三个框架都提供了简单的方法能让你向HTML里填充自定义信息,可以让大家领略到你酷炫的前端技术。

模板能让你直接向页面中嵌入动态信息,而不用发送AJAX请求。这对于用户体验是有利的,你能一次加载整个页面和它的动态数据。这对于移动端网站是非常重要的,能够节省数秒钟时间。

所有的我们使用的模板都依赖上下文提供动态信息,并将其通过模板渲染进HTML。模板的最简单使用场景是很流行的一个例子,给已登录的用户的名字打招呼。也可以使用AJAX来获取动态信息,但需要一个调用来获取用户名信息,这样可能有点费事了,毕竟用模板来实现这么简单。

5.1 Django

我们这里的使用场景非常简单,假定我们有一个user对象,它有一个fullname的属性,里面包含一个用户的名字。在Python里,我们会这样把当前用户信息传递给模板: